فشرده‌سازی و cache می‌توانند ترافیک را کم کنند، اما ذخیرهٔ پاسخ شخصی در cache خطرناک است. امشب فقط دارایی‌های ثابت را تنظیم می‌کنیم و رفتارشان را با پاسخ HTML مقایسه می‌کنیم.

این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نام‌ها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.

محیط: www با HTTPS؛ ماژول‌های filter، deflate و expires. در Debian با a2enmod filter deflate expires فعال کن؛ در RHEL خروجی -M را ببین.

دامنهٔ تنظیم را محدود کن#

sudo install -d -m 755 /var/www/apache-lab/public/assets
printf '%s\n' 'body { color: #00aa66; }' | sudo tee /var/www/apache-lab/public/assets/lab.css

در سایت www:

<Directory /var/www/apache-lab/public/assets>
    AddOutputFilterByType DEFLATE text/css application/javascript
    ExpiresActive On
    ExpiresByType text/css "access plus 1 hour"
    ExpiresByType application/javascript "access plus 1 hour"
</Directory>

پوشه هنوز policy خواندن شب پنجم را به ارث می‌برد. DEFLATE پاسخ را با gzip فشرده می‌کند؛ نوع MIME باید درست باشد. این تنظیم برای صفحهٔ ورود یا خروجی API فعال نشده است. پاسخ‌های دارای راز که ورودی مهاجم را بازتاب می‌دهند به تحلیل خطر فشرده‌سازی نیاز دارند.

curl --cacert ~/apache-lab/pki/ca.crt \
  --resolve www.example.test:443:192.168.56.10 \
  -H 'Accept-Encoding: gzip' -D - -o /dev/null https://www.example.test/assets/lab.css

انتظار داریم Content-Encoding: gzip، اطلاعات cache و Vary: Accept-Encoding متناسب با فشرده‌سازی دیده شوند. درخواست بدون Accept-Encoding را هم بفرست؛ همان فایل باید بدون الزام gzip قابل دریافت باشد.

تغییر فایل و اعتبار cache#

وقتی محتوای فایل تغییر می‌کند، یک URL با hash محتوا می‌تواند cache طولانی و immutable داشته باشد. فایل lab.css بدون version چنین تضمینی ندارد؛ cache کوتاه انتخاب مناسب تمرین است. برای پاسخ شخصی، سیاست برنامه مانند Cache-Control: private, no-store را حفظ کن.

تمرین و بازگشت: فایل CSS را تغییر بده و تفاوت درخواست تازه، cache مرورگر و revalidation را ببین. بلوک expires را بردار و دوباره هدرها را بررسی کن. پاک شدن policy سرور الزاماً cache قبلی کلاینت را فوری حذف نمی‌کند.

منبع: mod_deflate ، mod_expires ، cache در HTTP .