วิธีป้องกันการแคชไฟล์ http ใน Apache httpd (MAMP)


139

ฉันกำลังพัฒนาแอปพลิเคชัน Javascript หน้าเดียวใน MAMP ไฟล์เทมเพลต JavaScript และ HTML ของฉันถูกแคชระหว่างคำขอ

มีวิธีง่าย ๆ ในการระบุใน MAMP ที่ฉันต้องการป้องกัน http ไฟล์แคชหรือไม่? อาจเป็นไปได้กับ.htaccessไฟล์? ฉันจะวาง.htaccessหรือแก้ไขโฮสต์เสมือนสำหรับ MAMP บน Mac ได้อย่างไร

คำตอบ:


318

พยายามนี้ไหม ควรจะทำงานทั้งใน.htaccess, httpd.confและในVirtualHost(มักจะวางไว้ในhttpd-vhosts.confถ้าคุณได้รวมจากคุณ httpd.conf)

<filesMatch "\.(html|htm|js|css)$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

ป้องกันไฟล์ไม่ให้ถูกแคช 100%

สิ่งนี้คล้ายกับวิธีที่โฆษณาของ Google ใช้การควบคุมแคชส่วนหัว: ส่วนตัว, x-gzip-ok = ""> เพื่อป้องกันการแคชโฆษณาโดยพร็อกซีและลูกค้า

จากhttp://www.askapache.com/htaccess/using-http-headers-with-htaccess.html

และเลือกที่จะเพิ่มนามสกุลสำหรับไฟล์เทมเพลตที่คุณเรียกใช้หากคุณใช้นามสกุลอื่นนอกเหนือจาก.htmlที่มีอยู่


2
ขอบคุณนี้ใช้งานได้ดีมากในไฟล์. htaccess ฉันสามารถเห็นตัวเลือกการควบคุมแคชเมื่อฉันตรวจสอบส่วนหัวและไฟล์ของฉันปรากฏขึ้นพร้อมกับ http 200 แทนที่จะเป็น 304 ระหว่างคำร้องขอสิ่งที่ฉันต้องการ
dmck

2
อย่าลืมเพิ่มคำสั่ง LoadModule LoadModule headers_module lib/modules/mod_headers.so
Spenhouet

ฉันสามารถใช้ส่วนหัวเหล่านั้นกับไฟล์ทุกประเภทได้แทนที่จะกำหนดนามสกุลทีละตัวหรือไม่
Thariq Nugrohotomo

1
@ThariqNugrohotomo ใช่มันเป็นไปได้! เป็นสำนวนปกติคุณสามารถลอง<filesMatch "\.+">หรือ<filesMatch ^>
Charlie Rudenstål

ฉันไม่ได้ใช้ MAMP แต่เป็น Apache บนเว็บเซิร์ฟเวอร์ ฉันต้องเปิดใช้งานส่วนหัวและโมดูลหมดอายุในการติดตั้ง Apache ของฉันด้วยการพิมพ์ "sudo a2enmod headers" และ "sudo a2enmod expires" จากนั้น sudo service apache2 เริ่มต้นใหม่ คำสั่ง / แท็ก LoadModule และ IfModule ไม่จำเป็น - เพียงละเว้นส่วนแท็ก IfModule ที่อยู่ด้านบน แต่ยังคงเข้าสู่การตั้งค่าส่วนหัวระหว่างพวกเขา -
andruo11

5

ตามตัวอย่างที่นี่: http://drupal.org/node/550488

ต่อไปนี้อาจจะทำงานใน. htaccess

 <IfModule mod_expires.c>
   # Enable expirations.
   ExpiresActive On

   # Cache all files for 2 weeks after access (A).
   ExpiresDefault A1209600

  <FilesMatch (\.js|\.html)$>
     ExpiresActive Off
  </FilesMatch>
 </IfModule>

น่าเสียดายที่นี่ไม่ทำงานเมื่อฉันใส่ไฟล์. htaccess ในไดเรกทอรีโครงการ ฉันไม่แน่ใจว่า mod_expires เปิดใช้งานอยู่หรือไม่
dmck

5
@dmck: ลบส่วน<IfModule mod_expires.c>และ</IfModule>.. หากไม่ได้เปิดใช้งาน mod_expires คุณจะได้รับข้อผิดพลาดแทนที่จะเป็นคำสั่งที่ถูกละเว้นอย่างเงียบ ๆ
Stennie

ในไดเรกทอรีโครงการข้อผิดพลาดทางไวยากรณ์เล็กน้อยที่นี่อาจทำให้เกิดข้อผิดพลาด 500
SDsolar

3

ฉันมีปัญหาเดียวกัน แต่ฉันพบทางออกที่ดีที่นี่: หยุดแคชสำหรับ PHP 5.5.3 ใน MAMP

ค้นหาไฟล์ php.ini โดยทั่วไปและใส่เครื่องหมายความคิดเห็นในบรรทัด OPCache ฉันหวังว่าคำตอบทางเลือกนี้จะช่วยผู้อื่นเช่นกัน


3
นั่นคือเกี่ยวกับการแคช PHP บนฝั่งเซิร์ฟเวอร์หรือที่รู้จักว่า OPCache คำถามเกี่ยวกับไฟล์ที่ถูกแคชโดยเบราว์เซอร์ที่ร้องขอผ่าน HTTP
Flion

2

หากไม่มี mod_expiresจะเป็นการยากที่จะตั้งค่าส่วนหัวการหมดอายุในไฟล์ของคุณ สำหรับสิ่งใดก็ตามที่สร้างขึ้นคุณสามารถตั้งค่าส่วนหัวเริ่มต้นให้กับคำตอบได้โดยทำหน้าที่ mod_expires ดังนี้:

<?php header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); ?>

(นำมาจาก: คำตอบ Stack Overflow จาก @brianeggeซึ่งโซลูชัน mod_expires ได้อธิบายไว้ด้วย)

ตอนนี้สิ่งนี้จะไม่ทำงานสำหรับไฟล์คงที่เช่นไฟล์ javascript ของคุณ สำหรับไฟล์คงที่มีเพียง apache (ไม่มีโมดูลการหมดอายุ) ระหว่างเบราว์เซอร์และไฟล์ต้นฉบับ เพื่อป้องกันการแคชไฟล์ javascript ซึ่งกระทำบนเบราว์เซอร์ของคุณคุณสามารถใช้โทเค็นแบบสุ่มที่ส่วนท้ายของ js url คล้ายกับ?rd=45642111ดังนั้น URL จึงมีลักษณะดังนี้:

<script type="texte/javascript" src="my/url/myjs.js?rd=4221159546">

หาก URL นี้ในหน้าถูกสร้างขึ้นโดยไฟล์ PHP คุณสามารถเพิ่มส่วนที่สุ่มด้วย PHP ได้ วิธีการสุ่ม url ด้วยการต่อท้ายพารามิเตอร์สตริงการสืบค้นแบบสุ่มนี้คือการตั้งค่าพื้นฐานที่ไม่ใช่การตั้งค่าแคชของคำขอ ajax jQuery เบราว์เซอร์จะไม่พิจารณา 2 url ที่มีสตริงการสืบค้นที่แตกต่างกันและจะไม่ใช้เวอร์ชันแคช

แก้ไข

โปรดทราบว่าคุณควรทดสอบmod_headersด้วย หากคุณมี mod_headers คุณสามารถตั้งค่าส่วนหัว Expires ได้โดยตรงด้วยคำหลักHeader


ขอบคุณขออภัยฉันไม่ได้ใช้ไฟล์ PHP ใด ๆ ฉันจะตรวจสอบ mod_headers และติดตั้ง mod_expires
dmck

สิ่งที่เกี่ยวกับการป้องกันการแคชไฟล์ CSS?
Aaron Franke

1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>

นั่นไม่ใช่คำตอบที่มีคุณภาพดี พยายามอธิบายโดยละเอียดว่าขั้นตอนใดบ้างสำหรับการแก้ไขปัญหาที่รายงานใน OP
leopal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.