2009-12-21 51 views
9

Something, tôi nghĩ rằng Apache, thêm các tiêu đề HTTP cho tất cả các phản ứng tạo ra bởi kịch bản PHP:PHP remove tiêu đề HTTP

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

này hoạt động ok cho các trang động thực tế, nhưng tôi có một số trang đó, trong khi tạo ra bởi PHP, chủ yếu là tĩnh, và tôi muốn trình duyệt lưu trữ chúng.

Có cách nào trong PHP để loại bỏ các tiêu đề đó khỏi phản hồi không, và nếu không, có giá trị nào tôi có thể đặt chúng tương đương với chúng không?

Tôi không muốn đặt giá trị của riêng mình, vì tôi muốn trình duyệt sử dụng cùng các quy tắc bộ nhớ đệm như đối với tài nguyên tĩnh được phục vụ bởi chính Apache (không sử dụng mod_cache).

Trả lời

2

Trước tiên, tôi sẽ kiểm tra xem nó có thực sự không phải là một trong những tập lệnh php đặt các tiêu đề này hay không.

register_shutdown_function('foo'); 
echo "test"; 

function foo() { 
    flush(); 
    $c = "headers_list: \n " . join("\n ", headers_list()); 

    if (function_exists('apache_response_headers')) { 
    $c .= "\napache_response_headers:"; 
    foreach(apache_response_headers() as $k=>$v) { 
     $c.= "\n $k=$v"; 
    } 
    } 
    $c .= "\n\n"; 
    echo '<pre>', $c, '</pre>'; 
} 

Điều này có thể in thứ gì đó "có thể sử dụng" trên máy chủ của bạn không?

+1

Tôi đã thực hiện nghiên cứu, và nó xuất hiện PHP đặt tiêu đề khi sử dụng các hàm phiên. Có nhiều cách để thay đổi giá trị của các tiêu đề, nhưng không ngăn cản chúng được thiết lập –

+2

Trên thực tế, việc thiết lập session.cache_limit thành "none" (giá trị không có giấy tờ) đã giải quyết nó. Xem http://stackoverflow.com/question/681115/cache-control-header-modified-by-php-phiên –

+0

wow, tôi sẽ không nghĩ về điều đó cho các lứa tuổi ;-) – VolkerK

2

Bạn có thể cung cấp thủ công tiêu đề HTTP từ PHP qua chức năng header().

Tôi tưởng tượng rằng làm như vậy phải tắt giá trị tiêu đề mặc định của máy chủ web.

+0

Nếu tôi đặt chúng thành chuỗi trống, ví dụ: "Cache-Control:", các trình duyệt sẽ diễn giải điều này giống như khi nó vắng mặt? –

+0

bạn có chắc chắn rằng PHP không chỉ thêm các dòng tiêu đề, mà còn tạo ra tiêu đề hoàn toàn mới không? – dusoft

+0

Hành vi mặc định là thay thế các tiêu đề hiện có có cùng tên, như được thấy trong tài liệu cho tiêu đề() –

7

Đối với những tệp cụ thể đó, bạn có thể thêm các cuộc gọi tiêu đề() đặt các tiêu đề này khác nhau. I E. header("Expires: " . $currentDatePlus10);

header("Cache-Control: max-age=3600, must-revalidate") 
+0

Nếu có thể, tôi thực sự muốn loại bỏ tiêu đề hoàn toàn, để hành vi của trình duyệt hoàn toàn giống với các tệp tĩnh bình thường trên máy chủ chưa được định cấu hình. –

+0

Vì nó xảy ra bên ngoài môi trường PHP, việc đào bới xung quanh trong Apache, việc ghi đè bằng một giá trị khác sẽ là đặt cược tốt nhất của bạn. Tôi thường sẽ sử dụng ngày hết hạn vô lý cho nội dung tĩnh (đọc 10 năm) để giữ cho nội dung được lưu trữ. – Myles

+1

Tôi lo ngại rằng nếu tôi đặt nó vào một ngày 10 năm trong tương lai, những thay đổi sẽ thực sự không được người dùng chọn. –

1
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT"); 

hoặc một thời gian đều vô lý trong tương lai xa. Hãy nhớ đặt các giá trị tiêu đề của bạn trước khi bất kỳ đầu ra nào được gửi đi, trừ khi bạn đang thực hiện đệm đầu ra cho toàn bộ trang của mình.

http://php.net/manual/en/function.header.php

0

đàn áp của bộ nhớ cache có thể được thực hiện như sau: PHP Code:

header ("Cache-Control: no-cache, must-revalidate");// HTTP/1.1 
header ("Expires: Mon, 1 Jul 1990 05:00:00 GMT");// Date in the past 

nếu bạn muốn tự động tạo ra nó, sau đó bạn này ở đây: PHP: session_cache_limiter() - họ Manual

+0

Đây chính xác là những gì tôi đang cố gắng để ngăn chặn –

+0

xin lỗi nhưng bạn không có quyền truy cập vào bộ nhớ cache của trình duyệt để bạn phải sử dụng http://at.php.net/manual/de/function.session-cache- expire.php – streetparade

-1

Tôi chưa thử điều này nhưng bạn có thể lưu các trang như tệp .html với tiêu đề tùy chỉnh của bạn hoặc thiếu phần đầu của chúng và tập lệnh có thể chạy bên trong

0

Có thể có nơi nào đó trong mã của bạn đã đặt các biến này, vì tôi không thể tìm thấy chúng được PHP tự động chèn vào bất kỳ đâu, cũng như chúng trong bất kỳ cài đặt LAMP nào của tôi.

Tiêu đề được tạo tự động duy nhất cho lượt cài đặt của tôi là X-Powered-By với phiên bản PHP.

Như bạn đã nói, từ tài liệu họ khuyên bạn nên nói header("Expires:"); để thay thế tiêu đề cũ, nhưng header("Cache-control:"); vừa trở thành Cache-Control: max-age=0 trong trình duyệt của tôi (vì vậy đây không phải là những gì bạn đang cố gắng làm).

Tôi khuyên bạn nên kiểm tra xem các giá trị này đến từ một khung hoặc cài đặt bạn đã thay đổi, nhưng nó có thể khác nhau trên các phiên bản PHP/nền tảng khác nhau mà bạn đang chạy PHP.

Tôi muốn kiểm tra các chỉ thị ExpiresByType hoặc ExpiresDefault trong các cấu hình toàn cục, vhost, pr.các tệp htaccess hoặc bất kỳ khối nào được đóng gói trong <IfModule mod_expires> hoặc <IfModule mod_expires.c>

"Tôi muốn trình duyệt sử dụng cùng một quy tắc lưu bộ nhớ cache cho tài nguyên tĩnh được phục vụ bởi Apache (không sử dụng mod_cache)."

Thử xem tài nguyên tĩnh và sau đó kết hợp các quy tắc. Bạn có thể tính toán Expires offest bằng cách này ->http://www.php.net/manual/en/function.header.php#93377

+0

Tôi chắc chắn các tiêu đề không được đặt từ bên trong PHP. @ "Hãy thử xem xét một tài nguyên tĩnh và sau đó phù hợp với các quy tắc sau đó.": Đó là điểm, họ không có các tiêu đề;) –

+0

cho tôi làm điều này đơn giản hơn cho bạn, "là có bất kỳ giá trị tôi có thể đặt chúng tương đương với họ vắng mặt?" không thực sự. (Trống) sẽ được interpretted bởi mỗi trình duyệt. 'Tôi không muốn thiết lập các giá trị của riêng tôi' này là không thể khi bạn hoặc máy chủ của bạn đã có ở đâu đó. –

+0

Ok, tôi chắc chắn các các tiêu đề không được thiết lập bởi mã của tôi, mặc dù chúng được thiết lập bởi PHP khi bạn sử dụng các phiên của nó. Xem bình luận của tôi @VolkerK –

0

Nếu trang của bạn đang thay đổi không thường bạn nên xem xét sử dụng các header ETag, như thế này:

https://gist.github.com/oliworx/4951478

này rất hữu ích đặc biệt là trên các kết nối chậm (như điện thoại di động).

Gợi ý: Bạn nên thường xuyên kiểm tra, những gì trình duyệt đang thực sự tải, với các addon firefox "Live HTTP header": https://addons.mozilla.org/de/firefox/addon/live-http-headers/

1

Những tiêu đề bộ nhớ cache được gửi đi khi bạn bắt đầu sử dụng phiên và thiết lập để "nocache" bởi mặc định; điều này đảm bảo mỗi yêu cầu cung cấp kết quả nhất quán.

Ví dụ: nếu bạn có hệ thống giỏ hàng và trình duyệt của bạn lưu trữ /add?product=xyz, nó không thể thêm lại sản phẩm; điều này có lẽ không phải là những gì bạn muốn.

Có nói rằng, các thiết lập mặc định có thể được thay đổi bằng cách sử dụng session_cache_limiter()trướcsession_start() hoặc thiết lập tương ứng với thiết lập session.cache_limiter cấu hình.

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