سؤال

كيف يمكنني توليد ETag HTTP مورد الملف ؟

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

المحلول

وهو etag التعسفي سلسلة يرسل الملقم إلى العميل أن العميل سوف ترسل مرة أخرى إلى الخادم في المرة القادمة الملف المطلوب.

Etag يجب أن يكون محسوب على الملقم استنادا إلى ملف.نوع من مثل الاختباري ، ولكن قد لا ترغب في الاختباري كل ملف يرسل بها.

 server                client

        <------------- request file foo

 file foo etag: "xyz"  -------->

        <------------- request file foo
                       etag: "xyz" (what the server just sent)

 (the etag is the same, so the server can send a 304)

لقد تراكمت سلسلة في شكل "ملف inode number/تاريخ الختم/حجم الملف".حتى لو تغيير ملف على الخادم بعد أن تم تقديمها إلى العميل حديثا مجدد etag لا تتطابق إذا كان العميل إعادة يطلب ذلك.

char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size);
    return s;
}

نصائح أخرى

طالما أنه يتغير كلما الموارد التمثيل التغييرات ، كيف تنتج هذا هو تماما متروك لكم.

يجب أن تحاول أن تنتج بطريقة بالإضافة إلى ذلك:

  1. لا تتطلب منك إعادة حساب على بعضهم مشروط على ،
  2. لا يغير إذا كان المورد المحتوى لم يتغير

باستخدام التجزئة من المحتوى يمكن أن يسبب لك أن تفشل في #1 إذا كنت لا تقم بتخزين محسوب التجزئة جنبا إلى جنب مع الملفات.

باستخدام inode الأرقام يمكن أن يسبب لك أن تفشل في #2 إذا كان يمكنك إعادة ترتيب الملفات الخاصة بك أو كنت تخدم المحتوى من خوادم متعددة.

إحدى الآليات التي يمكن العمل هو استخدام شيء تماما المحتوى تعتمد مثل SHA-1 hash أو إصدار سلسلة حسابها وتخزينها مرة واحدة كلما الموارد الخاصة بك تغيير المحتوى.

من http://developer.yahoo.com/performance/rules.html#etags:

بشكل افتراضي ، سواء Apache و IIS تضمين البيانات في ETag أن يقلل بشكل كبير من احتمالات صحة اختبار النجاح على مواقع ويب مع ملقمات متعددة.

...

إذا كنت لا تستفيد من مرونة التحقق من صحة النموذج الذي ETags تقدم ، فمن الأفضل أن مجرد إزالة ETag تماما.

كيفية توليد الافتراضي أباتشي etag في باش

for file in *; do printf "%x-%x-%x\t$file\n" `stat -c%i $file` `stat -c%s $file` $((`stat -c%Y $file`*1000000)) ; done

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

لقد تم استخدام أدلر-32 html رابط المقلل.ايم ليس متأكدا مما إذا كان هذا هو فكرة جيدة, ولكن حتى الآن أنا لم ألحظ أي التكرارات.قد عمل etag مولد.وينبغي أن يكون أسرع ثم يحاول تجزئة باستخدام نظام التشفير مثل sha, لكني لم يتم التحقق هذه.الكود الأول هو استخدام:

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]

أنصح بعدم استخدامها والذهاب آخر تعديل رؤوس بدلا من ذلك.

Askapache لديه المادة مفيدة على هذا.(كما يفعلون كل شيء إلى حد كبير على ما يبدو!)

http://www.askapache.com/htaccess/apache-speed-etags.html

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