2010-06-15 17 views
28

Tôi có một trang web bảo trì mà tôi đã kế thừa, đó là một mớ hỗn độn lớn.
Một trong những điều tôi đang làm là cải thiện hiệu suất. Trong số những thứ khác, tôi đang thêm các tiêu đề Expires vào hình ảnh.Điều gì có thể thêm "Pragma: no-cache" vào tiêu đề phản hồi của tôi? (Apache, PHP)

Bây giờ, có một số hình ảnh được phân phát qua tệp PHP và tôi nhận thấy rằng chúng có tiêu đề Expires, nhưng chúng cũng được tải mỗi lần.

Nhìn Tiêu đề phản hồi, tôi thấy điều này:

Expires Wed, 15 Jun 2011 18:11:55 GMT 
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma no-cache 

Mà rõ ràng giải thích vấn đề.

Bây giờ, tôi đã xem xét tất cả các cơ sở mã và không nói "pragma" ở bất kỳ đâu. .htaccess dường như không có liên quan gì cả.

Bất kỳ ý tưởng nào có thể đặt các tiêu đề "pragma" (và "bộ nhớ cache kiểm soát") và cách tôi có thể tránh nó?

Trả lời

9

Tạo một tệp đơn giản không bao gồm thư viện PHP của bạn nhưng sống trong cùng thư mục với tệp phục vụ hình ảnh của bạn thông qua tệp PHP.

file: test.php 

Yêu cầu tệp này thông qua trình duyệt và kiểm tra tiêu đề. Nếu bạn thấy các tiêu đề Phản hồi mà bạn không muốn, bạn biết rằng chúng được định cấu hình qua apache và không được tạo thông qua tệp PHP và bạn có thể tập trung tìm kiếm của mình trên tệp .htaccess trong cây thư mục và trên http.confg và các tệp cấu hình apache khác. Bạn sẽ muốn tìm kiếm

<Directory.... 

<VirtualHost 

phần mà có thể áp dụng cho trang web của bạn.

Nếu bạn không thấy tiêu đề trong yêu cầu cho tệp PHP đơn giản đó, bạn biết rằng PHP đang đặt tiêu đề ở đâu đó. Vào cuối tập tin phục vụ hình ảnh của bạn (hoặc ngay sau khi nó Echos hình ảnh và lối thoát hiểm), nhưng đoạn PHP sau)

var_dump(get_included_files()); 

Yêu cầu một hình ảnh thông qua các hình ảnh phục vụ URL. Đoạn mã trên sẽ in ra tất cả các tệp PHP được sử dụng trong yêu cầu. (có thể bạn sẽ cần phải xem nguồn hoặc sử dụng curl để xem đầu ra thô, vì trình duyệt sẽ báo cáo hình ảnh không hợp lệ)

Có tập hợp con tệp của bạn để làm việc, tìm kiếm qua các cuộc gọi đến

header(); 

chức năng. Hàm header là cách duy nhất (tôi nghĩ) rằng mã PHP thô có thể đặt tiêu đề Phản hồi.Bạn cũng sẽ muốn tìm kiếm

call_user_func 
eval 
$$ 

trong trường hợp có bất kỳ mã động trên trang đó là sử dụng khả năng siêu lập trình PHP để gọi header chức năng.

Chúc may mắn!

+0

Wow, cảm ơn bạn đã trả lời chi tiết. Đó chắc chắn là cấu hình của Apache, nhưng tôi không có quyền truy cập vào nó. Tôi chỉ có quyền truy cập FTP vào thư mục trang web của mình. Bất kỳ ý tưởng làm thế nào tôi có thể ghi đè/loại bỏ các tiêu đề bằng cách sử dụng các tập tin .htaccess của tôi? –

+0

Thật không may, đó là quá chung chung để nhanh chóng đưa ra câu trả lời. Bạn cần phải biết các chỉ thị Apache nào đã gây ra bộ nhớ đệm để ghi đè lên các hiệu ứng và cần phải biết liệu chúng có thể ghi đè lên .htacess VÀ biết cú pháp để làm như vậy. Thay vì lãng phí quá nhiều thời gian, tôi sẽ nâng chuỗi này lên quản trị viên máy chủ và xem liệu họ có thể giúp bạn không, vì "caching theo mặc định" không phải là cấu hình mặc định của Apache và/hoặc mô-đun PHP. #nothelpfulsorry –

+0

Cảm ơn bạn rất nhiều. –

1

Nếu nó không có trong .htaccess, nó có thể nằm trong tệp cấu hình Apache chính - hoặc một trong các tệp cấu hình của nó, tùy thuộc vào thiết lập.

+0

Bất kỳ ý tưởng nào về cách ghi đè từ .htaccess của tôi? (Tôi không có quyền truy cập SSH vào máy chủ này hoặc truy cập vào httpd.conf) –

+0

Không chắc chắn cách * loại bỏ * một tiêu đề thực sự - hãy thử hỏi trên serverfault. –

-1

Chạy grep -R pragma . để xem qua các tệp.

+1

Thực hiện điều đó. Không có gì. Đó là những gì tôi có nghĩa là "Tôi nhìn qua tất cả các cơ sở mã" –

6

Thử đặt tiêu đề ở .htaccess. Ví dụ dưới đây sẽ bỏ đặt chúng cho tất cả các file phù hợp với các phần mở rộng ico, jpeg, png, gif, js, css:

<FilesMatch "\.(ico|jpeg|png|gif|js|css)$"> 
    Header unset Cache-Control 
    Header unset Pragma 
</FilesMatch> 

Bạn có thể tìm thấy một số gợi ý trong this article.

27

Thủ phạm có thể là php.ini, trong đó session.cache_limiter = nocache. Thay đổi giá trị thành trống hoặc công khai để tránh tiêu đề chống bộ nhớ cache.

+0

Cảm ơn bạn! Tôi đã thay đổi giá trị mặc định của session.cache_limiter ('nocache') thành '' và nó đã giải quyết được vấn đề. – Yeroon

+0

Để "công khai", điều đó không nguy hiểm đối với một trang web có một số trang riêng tư? –

+0

Có lẽ đó là hạn chế bộ nhớ đệm chỉ đối với tài liệu công khai. – technomage

3

Tôi đã làm điều này trong thời gian chạy với điều này:

header("Pragma:"); 

mà buộc kịch bản để bỏ đặt tiêu đề pragma.

+0

Đó là công trình, tôi có thể thấy rằng pragma đã bị ghi đè. –

10

Tôi đã có một vấn đề tương tự với Pragma: nocache

session_cache_limiter(false); trước session_start(); dường như để ngăn chặn nó.

+0

Xem: http://php.net/manual/en/function.session-start.php – Almer

0

Điều đáng chú ý đối với những người có vấn đề tương tự mà nhiều khung sẽ tự động thêm tiêu đề đặc biệt là bộ nhớ đệm. Nó khá dễ dàng để quá tải chúng trong thư viện khung hoặc trong ứng dụng của bạn.

+0

Bất kỳ lý do nào cho downvote? Tôi biết rằng Zend tự động thêm tiêu đề. Các tiêu đề có thể được quá tải thông qua thẻ tiêu đề của php như được hiển thị bởi Michael hoặc khuôn khổ sẽ có chức năng cụ thể của họ để làm điều đó. Đối với Zend, bạn phải sử dụng setHeader() – twunde

Các vấn đề liên quan