it-swarm-vi.tech

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

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?

101
Unkwntech

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à dấu 'không bắt được', 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";
}
135
J. M. Becker
server {
    ...

    location ~* \.css$ {
       expires 30d;
    }
    ...
}

Lệnh location

Lệnh expires

22
Dave Cheney

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 img-cache.conf

và sau đó đưa tệp đó vào chỉ thị server {...} 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 - bảo mật 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ó 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;
}
19
amurrell

Bạn cũng có thể đặt hết hạn đế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;
}
9
Jauder Ho

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;
   }
...
}

Off vô hiệu hóa bộ nhớ đệm, Epoch (đối với 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 .

4
Pantura

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.

2
user161646