هل يجب أن تحتوي HTTP 304 غير المعدلة على رؤوس التحكم في ذاكرة التخزين المؤقت؟

StackOverflow https://stackoverflow.com/questions/1587667

  •  22-09-2019
  •  | 
  •  

سؤال

لقد حاولت أن أفهم هذا ، وبحثت عن أسئلة مماثلة ، لكن ما زلت لا أملك فهمًا بنسبة 100 ٪ حول كيفية عمل ذلك.

أحصل على هذا الرد بناءً على طلب لمورد صورة:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:04:04 GMT
    Expires Mon, 19 Oct 2009 09:06:05 GMT
    Cache-Control   public, max-age=120
    Etag    image_a70703fb393a60b6da346c112715a0abd54a3236
    Content-Disposition inline;filename="binary-216-420"
    Content-Type    image/jpg;charset=UTF-8
    Content-Length  4719

السلوك المطلوب هو أن العميل يجب أن يقوم بتخزين هذا لمدة 120 ثانية ، ثم اطلبه من الخادم مرة أخرى. في غضون 120 ثانية ، لا يتم إرسال أي طلب إلى الخادم.

ثم ، بعد 120 ثانية ، يتم إرسال طلب واستلام 304 رد:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:06:13 GMT

Request Headers
    Host    localhost:8080
    User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
    Accept  image/png,image/*;q=0.8,*/*;q=0.5
    Accept-Language en-us,no;q=0.8,sq;q=0.7,en;q=0.5,sv;q=0.3,nn;q=0.2
    Accept-Encoding gzip,deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive  300
    Connection  keep-alive
    Referer http://localhost:8080/cms/site/0/en/home
    Cookie  JSESSIONID=768ABBE1A3BFABE3B535900233330650; versionsCssDisplayState=block; iceInfo=iceOn:false,activePortletKey:,icePagePanelX:1722,icePagePanelY:3
    If-None-Match   image_a70703fb393a60b6da346c112715a0abd54a3236

حتى الآن ، كل شيء جيد. ولكن بعد ذلك ، بناءً على الطلب التالي (Whithin 120 Seconds) كنت أعتقد أنه يجب تخزين المورد لمدة 120 ثانية جديدة. ما أراه في المتصفح (Firefox) من ناحية أخرى ، هو أنه من هذه النقطة على طلب المورد دائمًا ويتلقى استجابة 304.

هل من المفترض أن أرفق رؤوس التحكم في ذاكرة التخزين المؤقت في الاستجابة 304؟ من ما يمكنني قراءته في المواصفات ، يبدو أن إعدادات التحكم في ذاكرة التخزين المؤقت يجب حذفها ، وأنه يجب على ذاكرة التخزين المؤقت لها لمدة 120 ثانية جديدة تلقائيًا؟

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

المحلول

من الناحية النظرية ، لا يجب عليك إرسال التحكم في ذاكرة التخزين المؤقت لـ 304-يجب على المستلم الاستمرار في استخدام توجيهات ذاكرة التخزين المؤقت التي تلقتها من 200. ومع ذلك ، كما وجدت ، في الممارسة العملية إذا لم تفعل استمر في إرسال مراقبة ذاكرة التخزين المؤقت ، وسوف تتجاهل المتصفحات توجيهات ذاكرة التخزين المؤقت التي أرسلتها في الأصل ، وتعود إلى الاستدلال الافتراضي الخاص بها.

لذا ، في الممارسة العملية ، يجب أن تتضمن نفس السيطرة على ذاكرة التخزين المؤقت مع 304 التي تريدها مع 200. المواصفات تفرض فقط أن ترسلها لمدة 304 إذا كان مختلفًا عن ما أرسلته سابقًا (انظر 10.3.5 304 لم يتم تعديلها) - لكنها بالتأكيد لا تمنعك من تكرارها عندما يكون الأمر نفسه.

والرد على وجه التحديد على النقاط الخاطئة من الإجابة الأخرى (الهيكل):

  1. أنت فعل تريد ذاكرة التخزين المؤقت الوسيطة لتخزين استجابة (أي ، قم بتحديث إدخال ذاكرة التخزين المؤقت الخاصة بالمورد). سوف يستجيبون بشكل مناسب لطلبات العملاء الذين لديهم 200 أو 304 ، اعتمادًا على ما إذا كان العميل يتضمن رأسًا مشروطًا مثل IF-Modified-Since.

  2. 120 ثانية TTL إرادة يتم تحديثها بواسطة 304 (لذلك يجب ألا يقدم العميل نفسه طلبًا آخر لنفس المورد لمدة 120 ثانية على الأقل). والعملاء ، طالما أنهم ما زالوا يحصلون على محتوى مخبأة ، إرادة استمر في تقديم طلبات مشروطة للمورد ، والتي يمكنك الاستمرار في الاستجابة لها مع 304.

نصائح أخرى

RFC7232 تحديثات RFC2616 ليقول:

يجب أن يولد الخادم الذي يولد استجابة 304 أيًا من حقول الرأس التالية التي كان من الممكن إرسالها في استجابة 200 (OK) لنفس الطلب: التحكم في ذاكرة التخزين المؤقت ، وموقع المحتوى ، والتاريخ ، و ETAG ، وإنهاء الصلاحية ، وتختلف.

إذا فهمت بشكل صحيح ، فإن المتصفح في الواقع يتخلف عن التخزين المؤقت لمدة 120 ثانية ويستجيب الخادم الخاص بك 304 لم يتم تعديله على الطلبات اللاحقة إذا كانت المعدلة. يحدث طلب "IMS" عندما يصل المستخدم النهائي إلى عنوان URL نفسه. في ذلك الوقت ، يمكن للمستعرض إرسال طلب إذا تم تعديله. يريد المتصفح معرفة ما إذا كان يعرض محتوى قديم. هذا يبدو طبيعيا.

عند استلام هذا الطلب ، يجب على الخادم الخاص بك الرد على 200 موافق ، 304 غير تعديل (أو 4xx ، إذا لزم الأمر).

لا أعتقد أنه يجب عليك تعيين الخادم الخاص بك لإرسال رأس التحكم في ذاكرة التخزين المؤقت مع استجابة 304 لسببين:
1. لا تريد أي ذاكرة التخزين المؤقت الوسيطة لتخزين ذاكرة التخزين المؤقت 304 (هناك احتمال أن يتمكنوا من ذلك)
2. لن يتم تحديث 120 ثانية TTL من خلال استجابة 304. سيحتفظ المتصفح بالكائن لمدة 120 ثانية من استجابة 200 OK. بعد 120 ثانية المتصفح ينبغي أرسل طلب الحصول على ، وليس معدلًا ، لذلك سيستجيب الخادم الخاص بك مع بايت الملف وليس فقط استجابة 304.

لاحظ أن المتصفح لن يطلب الملف مرة أخرى تلقائيًا بعد 120 ثانية ما لم يطلب المستخدم النهائي ذلك على وجه التحديد عن طريق تحميل الصفحة أو إدخال عنوان URL مباشرة في شريط العناوين الخاص بهم (أو ما لم يكن لديك تطبيق مخصص يتحكم في هذه الوظيفة بطريقة أو بأخرى).

تم تحرير الفقرة الأولى لقراءة أفضل قليلاً (نأمل)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top