Làm cách nào để thay đổi tiêu đề Sửa đổi lần cuối trên nginx?


8

Máy chủ của tôi trả về các tiêu đề sau:

Cache-Control:no-cache
Connection:keep-alive
Date:Thu, 07 Jul 2011 10:41:57 GMT
Expires:Thu, 01 Jan 1970 00:00:01 GMT
Last-Modified:Thu, 07 Jul 2011 08:06:32 GMT
Server:nginx/0.8.46`

Tôi muốn nội dung tôi đang phục vụ không bị lưu vào bộ nhớ cache, vì vậy tôi đang tìm cách trả lại tiêu đề được sửa đổi lần cuối có chứa thời gian ngày khi yêu cầu được bắt nguồn. Một cái gì đó như bây giờ () ...

Câu trả lời:


10

"Tôi muốn nội dung tôi đang phục vụ không bị lưu vào bộ nhớ cache": Bạn có thể tắt If-Modified-Sincekiểm tra tiêu đề yêu cầu bằng if_modified_since off;chỉ thị. if_modified_since doc

Và về Last-Modifiedtiêu đề: Bạn có thể tắt nó vớiadd_header Last-Modified "";


1
Bạn không thể tắt tiêu đề bằng add_header , bạn chỉ có thể thêm chúng. Từ mục nhập: Lưu ý rằng nó chỉ nối thêm một mục tiêu đề mới vào danh sách tiêu đề đầu ra. Vì vậy, bạn không thể sử dụng chỉ thị này để viết lại các tiêu đề hiện có như Máy chủ. Sử dụng mô-đun headftemememore cho nó.
kolbyjack

Tôi đã kiểm tra nó curl -Dvà sau khi thêm add_header Last-MOdified "";vào nginx.conf của tôi, Last-Modifiedtiêu đề không còn ở đó trong tệp kết xuất.
thường

1
Ồ, nhìn vào nguồn, Kiểm soát bộ đệm và Sửa đổi lần cuối là các trường hợp đặc biệt và sẽ được đặt thay vì có thêm một mục nhập. Có vẻ như wiki cần được cập nhật.
kolbyjack

1
Tôi đã sai một lần nữa, Cache-Control là một vỏ bọc đặc biệt, nhưng nó không ghi đè lên, nó chỉ cần được thêm vào một cách đặc biệt. Chỉ Sửa đổi lần cuối mới đặt tiêu đề thay vì thêm một tiêu đề mới.
kolbyjack

Tốt để biết, bạn có thể chỉ cho tôi một tập tin? Có phải trong src/http/ngx_http_header_filter_module.c?
thường

6

Bạn có thể muốn làm cho nó trông giống như một tập tin luôn được sửa đổi:

add_header Last-Modified $date_gmt;
if_modified_since off;
etag off;

Đối với dòng cuối cùng, nếu bạn thực sự muốn ẩn một ngày sửa đổi cuối cùng thực sự, thì bạn cũng phải ẩn ETagtiêu đề vì nó rò rỉ dấu thời gian .


0

Tôi thực sự đã dành cả ngày cho việc này và không gần gũi hơn để khiến Nginx chơi đúng cách, đặc biệt là cách Nginx định dạng không chính xác tiêu đề Last-Modified: Date không nằm trong RFC cho tiêu đề Sửa đổi lần cuối.

Tôi đã tìm thấy giải pháp này tuy nhiên, nếu bạn đang sử dụng PHP, chỉ hoạt động tốt và có thể được điều chỉnh khi bạn cần. Hy vọng nó giúp. Chỉ cần bao gồm phần này ở đầu trang .php của bạn trước phần còn lại của mã.

<?php
//get the last-modified-date of this very file
$lastModified=filemtime(__FILE__);
//get a unique hash of this file (etag)
$etagFile = md5_file(__FILE__);
//get the HTTP_IF_MODIFIED_SINCE header if set
$ifModifiedSince=(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);
//get the HTTP_IF_NONE_MATCH header if set (etag: unique file hash)
$etagHeader=(isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);

//set last-modified header
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT");
//set etag-header
//header("Etag: $etagFile");
header("ETag: \"$etagFile\"");
//make sure caching is turned on
header('Cache-Control: private, must-revalidate, proxy-revalidate, max-age=3600');

//check if page has changed. If not, send 304 and exit
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])==$lastModified || $etagHeader == $etagFile)
{
       header("HTTP/1.1 304 Not Modified");
       header("Vary: Accept-Encoding");
       exit;
}
?>

Sau đó kiểm tra trang web của bạn tại redbot.org và www.hscripts.com

CẬP NHẬT:

  1. Đã thêm gửi tiêu đề khác nhau với phản hồi 304 không được sửa đổi (bắt buộc)
  2. Modified Cache: Độ tuổi tối đa của tiêu đề điều khiển có thể được điều chỉnh theo nhu cầu của riêng bạn.
  3. Để cung cấp tín dụng khi đến hạn, tôi đã tìm thấy giải pháp ở đây và tinh chỉnh nó một chút - https://css-tricks.com/snippets/php/intellect-php-cache-control/
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.