روبي على القضبان ، كيفية تعطيل/إيقاف ETag
-
21-09-2019 - |
سؤال
تحياتي
كيف يمكنني إيقاف ETag(s) في روبي على القضبان v2.3.5
عندما أقوم توجيه طلب إلى RoR/الهجين وهو ETag رأس الحالي.
تيا ،
-دانيال
المحلول
أسهل بكثير:
config.middleware.delete Rack::ETag
نصائح أخرى
وضع response.etag = nil
في ript_filter لا يعمل. يتم إنشاء ETAG قبل إرسال الاستجابة مباشرة (يتم تنقيحه من الجسم ، لذا بعد إجراء كل التقديم).
الحل الصحيح لتعطيل استخدام ETAG وتوليده (وبالتالي حفظ الوقت في قضاء MD5) هذا التصحيح القرد هذا:
module ActionController
class Request
# never match any incomming etag
def etag_matches?(etag)
false
end
end
class Response
# fake rails that our response already has an etag set and so none is generated automatically
def etag?
true
end
end
end
هناك etag
طريقة setter على ActionController::Response
الكائن ، الذي يحذف رأس ETAG HTTP إذا كان فارغًا ، لذلك يجب أن تكون قادرًا على مسحه في وحدة التحكم الخاصة بك (ربما في مرشح قبل):
response.etag = nil
لا أعتقد أنهم يعملون افتراضيًا.
ما أفهمه هو أنهم يحتاجون إلى ضبطها بشكل صريح باستخدام Stale؟/Fresh_ عندما الاتصال أو ما شابه.
أنا أعمل في القضبان 4 على WEBrick ، في محاولة للحصول على استجابة إلى ذاكرة التخزين المؤقت حتى تنتهي في وقت محدد كل يوم.يبدو أن ولدت السيارات ETag تتداخل مع انتهاء صلاحية ذاكرة التخزين المؤقت والذي هو السبب في أنني بحثت عن هذا الجواب.لم أجد أي شيء مفيد هنا ، ولكن لم تحل مشكلتي ، لذلك سوف أشارك.
tl;dr تعيين Last-Modified
رأس
ولكن تعيين إلى ماذا ؟ في حالتي كنت أحاول تحسين خدمة ويب التي تم إرجاعها في نتائج عملية التي يتم تشغيلها في نفس الوقت كل يوم.ردي رؤوس انتهى تبدو مثل هذا:
response.headers['Cache-Control'] = "max-age=86400"
response.headers['Expires'] = getCacheTime
response.headers['Last-Modified'] = getLastModified
الأولى تريد صراحة كتابة Cache-Control
رأس الكتابة كل ما هو الافتراضي.أنا وضعت الألغام إلى 24 ساعة تزامنا مع أقصى قدر من انتهاء الرأس.أنا وضعت انقضاء رأس مع وظيفة تبدو شيئا مثل هذا:
def getCacheTime
now = Time.now.utc
cacheTime = Time.utc(now.year, now.month, now.day, 22, 00, 00)
if now > cacheTime
cacheTime = cacheTime + (60 * 60 * 24)
end
cacheTime.httpdate
end
على getLastModified ترجع الدالة بالضبط 24 ساعة أقل من getCacheTime وظيفة.يبدو أن وضع هذا وقمع ETag (آخر التحقق من صحة التخزين المؤقت رأس) على الأقل في بلدي الحالي بيئة التطوير.
لماذا لا تضيف A قبل _filter في وحدة تحكم التطبيق الخاصة بك والتي تحدد ETAG إلى NIL؟