سؤال

أحاول أن أخبر nginx بتخزين بعض أصولي (js، css) مؤقتًا إلى الأبد، أو على الأقل لفترة طويلة جدًا.

الفكرة هي أنه بمجرد تجميع حزمة الأصول ونشرها باستخدام ملف /assets/ بادئة URI (على سبيل المثال /assets/foo-{fingerprint}.js) يبقى هناك ولا يحتاج إلى التغيير أبدًا.

أخبرني الإنترنت أنه يجب علي كتابة القاعدة التالية:

location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
  gzip_static on; # there's also a .gz of the asset
  expires max;
  add_header Cache-Control public;
  add_header Last-Modified "";
  add_header ETag "";
  break;
}

أتوقع أن يؤدي هذا إلى استجابات برمز HTTP 304 "غير معدل"، ولكن ما أحصل عليه هو HTTP 200 (موافق) ثابت في كل مرة.

لقد قمت بتجربة بعض الطرق الأخرى، على سبيل المثال:

أ) تحديد وقت التعديل بشكل صريح إلى نقطة زمنية ثابتة في الماضي؛

add_header Last-Modified "Thu, 01 Jan 1970 00:00:00 GMT";

ب) التحول إلى If-None-Match الفحوصات؛

add_header ETag $1;
if_modified_since off;

ومع ذلك، فإن الشيء الوحيد الذي نجح حقًا كما هو مطلوب هو:

add_header Last-Modified "Thu, 01 Jan 2030 00:00:00 GMT";
if_modified_since before;

أنا تائه.وهذا مخالف لكل ما اعتقدت أنه صحيح.الرجاء المساعدة.

هل كانت مفيدة؟

المحلول

يجب عليك تغيير شبكات الإنترنت الخاصة بك، لأنها تعطيك نصائح خاطئة.

فقط قم بإزالة الكل add_header خطوط من موقعك (بالإضافة إلى الفائض brake):

location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
   gzip_static on; # there's also a .gz of the asset
   expires max;
}

وقراءة المستندات من الإنترنت الحقيقي: http://nginx.org/r/expires و http://tools.ietf.org/html/rfc2616

نصائح أخرى

يبدو أنه جزء من التكوين الخاص بي.أثناء بحثي، أدركت أن المتصفح يستخدم التحليل الإرشادي للتحقق من صحة الطلبات باستخدام رؤوس ConditionalGet (E-Tag، Last-Modified).يعد هذا أمرًا منطقيًا جدًا بالنسبة للاستجابات الخلفية، لذا يمكنك التعامل مع ذلك لحفظ موارد الخادم.

ولكن فيما يتعلق بالملفات الثابتة (js، css، الصور)، يمكنك إخبار المتصفح بخدمتها على الفور دون أي تحقق مشروط.من المفيد أن تقوم بتحديث اسم الملف في حالة حدوث أي تغيير.

هذا الجزء من التكوين يجعل ذلك يحدث:

add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top