Cài đặt hết hạn tiêu đề cho nội dung tĩnh được cung cấp từ nginx


96

Tôi đang sử dụng nginx để lưu trữ nội dung tĩnh của mình, có cách nào để tôi có thể đặt các tiêu đề hết hạn cho mọi tệp đáp ứng quy tắc cụ thể không? Ví dụ: tôi có thể đặt tiêu đề hết hạn cho tất cả các tệp có phần mở rộng '.css' không?

Câu trả lời:


126

Tôi thích làm một tiêu đề bộ đệm hoàn chỉnh hơn, ngoài ra một số phần mở rộng tệp. Các '?' tiền tố là nhãn hiệu 'không bắt giữ', nginx sẽ không tạo $ 1. Nó giúp giảm tải không cần thiết.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

7
Tất cả các tệp tĩnh của tôi không được tìm thấy sau khi thêm nó.
Jürgen Paul

@JackSpairow: Tôi thực sự không thể giải thích tại sao điều đó xảy ra, vì nó luôn làm việc cho tôi. Bạn đang chạy Nginx thiếu mô-đun cung cấp add_header? Loại điều này thực sự bị giới hạn trong phạm vi, bạn có chắc chắn việc giảm tốc khác không phải là vấn đề kết hợp?
JM Becker

24
Có lẽ một khối khác có định nghĩa cho các tệp tĩnh với một roottập hợp, trong trường hợp đó bạn nên thêm các lệnh vào khối đó. (Tôi biết điều này muộn 2 năm, nhưng đối với những công dân tương lai)
aularon

1
Cá nhân tôi đánh giá cao sự làm rõ, đặc biệt là đối với những người tìm kiếm trong tương lai vì chúng thường xuất hiện rất lâu sau bài đăng gốc. +1: P
JM Becker

sử dụng điều này hoàn toàn làm rối trang web wordpress của tôi. css và hình ảnh không được hiển thị. Có bất kỳ xung đột khác ở đâu đó không?
dùng1641443


17

Tôi không đủ uy tín để bình luận về lý do tại sao câu trả lời được chấp nhận sẽ khiến các tệp không còn hiển thị nữa, nhưng tôi đã tìm ra nó và muốn giúp đỡ!

Phiên bản ngắn:

Đảm bảo rằng bạn có một thư mục gốc được chỉ định cho khối vị trí của bạn trên hình ảnh nếu bạn không có bộ toàn cầu!

Phiên bản dài dưới đây:


Trước hết, phương pháp thực hiện giải pháp này của tôi thực sự giống với câu trả lời này , trong đó bạn viết quy tắc (như trong câu trả lời được chấp nhận):

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

vào một tập tin img-cache.conf

và sau đó bao gồm tập tin đó vào server {...}chỉ thị của bạn .

Ví dụ của tôi về somesite.com trong thư mục trang web có sẵn của tôi:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

Bằng cách đó, bạn có thể thêm khối vị trí bộ nhớ đệm hình ảnh vào nhiều trang web bạn có thể đang chạy.


Thứ hai, tôi có một tình huống trong đó / var / www / của tôi chứa hai thư mục mà tôi cho phép là public_html - an toàn và đào tạo, vì vậy tôi phải tạo các khối vị trí cụ thể trong máy chủ của trang web của mình chỉ ra các thư mục này.

Như vậy, tôi không có một bộ thư mục gốc toàn cầu .

Vì vậy, khi bạn tạo khối vị trí hình ảnh của mình, bạn có thể không cung cấp cho họ thư mục gốc để tìm hình ảnh trong đó!

Giải pháp của tôi là:

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

1
+1 để làm điều này có thể tái sử dụng .conf. Các thư mục thích hợp trong nginx/1.14.0 (Ubuntu)dường như là /etc/nginx/snippets/.
Jan Werkhoven

9

Bạn cũng có thể đặt hết hạn tối đa. Đây là chỉ thị tôi sử dụng cho css và js.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}

1
Tôi sẽ chỉ sử dụng lệnh gốc trong khối {} của máy chủ, khi sử dụng nó ở các vị trí phụ sẽ dẫn đến hậu quả không mong muốn. Bạn không cần nghỉ ngơi; hoặc, vì bạn không ở trong khối if {}
Dave Cheney

Bạn đúng rồi. Quên để làm sạch này. Chỉnh sửa để phản ánh điều này.
Jauder Ho

4

Tất cả các giải pháp đã nói ở trên sẽ từ chối khả năng có các bí danh khác nhau cho các đường dẫn khác nhau. Ngoài ra, để có tất cả các lần hết hạn bộ nhớ cache khác nhau của bạn ở một nơi, bạn nên sử dụng bản đồ nginx theo cách sau.

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}

Offvô hiệu hóa bộ nhớ đệm, epoch(cho unix epoch) dẫn đến tài nguyên luôn được tải lại, maxđặt ngày thành giá trị tối đa của trình duyệt.

~ Hình ảnh / phù hợp với bất kỳ loại hình ảnh.

Tìm hiểu thêm về bản đồ nginx tại http://nginx.org/en/docs/http/ngx_http_map_module.html .


Lưu ý rằng nếu $sent_http_content_type"text/css;charset=UTF-8"biểu thức trên sẽ thất bại.
pachanka

2

Nếu bạn có một nơi chứa tất cả các tệp tĩnh của mình, một cái gì đó như thế này sẽ làm ...

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

Câu trả lời được chấp nhận khiến nginx không tìm thấy bất kỳ tệp tĩnh nào của tôi. Không thực sự chắc chắn tại sao, nhưng đây là một thay thế đơn giản.


Tôi đã bình chọn cho cái này nhưng đảm bảo bạn thêm /staticthư mục (bất cứ thứ gì bạn đặt ở vị trí) vào cuối bí danh (ngay sau .../filesví dụ).
Miro J.

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.