Nginx

將位置塊添加到記憶體文件會使這些文件返回 404

  • February 8, 2022

我想使用 Nginx 記憶體一些靜態文件。但我不知何故無法讓它工作。

這是我的nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
   worker_connections 768;
   #multi_accept on;
}


http {

   #GZIP
   gzip on;
   gzip_vary on;
   gzip_proxied any;
   gzip_comp_level 6;
   gzip_buffers 16 8k;
   gzip_http_version 1.1;
   gzip_min_length 256;
   gzip_types application/javascript application/json application/ld+json application/xml font/eot font/otf font/ttf text/css text/javascript text/plain text/xml;

   # SERVERS
   server {
           listen      80;

       server_name example.com;
       if ($http_host ~* ^www\.(.*)$ )
       {
           return 301 https://$1$request_uri;
       }

       return 301 https://$http_host$request_uri;
   }
   server {
       listen 443 ssl;

       if ($http_host ~* ^www\.(.*)$ )
       {
           return 301 $scheme://$1$request_uri;
       }


       #SSL
       ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
       ssl_certificate_key /root/.acme.sh/example.com/example.com.key;

       server_name example.com;

       # Pass all traffic to my webapplication
       location / {
           proxy_set_header Host $host;
           proxy_pass http://localhost:8080;
       }

       #Browser caching
       location ~* \.(js|css)$ {
           expires 180d;
           add_header Pragma "public";
           add_header Cache-Control "public";
       }
       location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
           expires 365d;
           add_header Pragma "public";
           add_header Cache-Control "public";
       }

   }
}

問題出在“瀏覽器記憶體”部分。啟用此程式碼塊時,我的網站會載入,但所有 css 文件、javascript 文件和圖像都返回 404。就像這些文件忽略了我的location /.

我能夠通過複製/粘貼來解決這個問題

proxy_set_header Host $host;
proxy_pass http://localhost:8080;

在我所有的location塊中,但這並不是很優雅,實際上讓我的網站感覺慢了很多……

我還嘗試將location瀏覽器記憶體的兩個塊移動到塊中location \,以便後者充當“父級”。但這並沒有機會圖像等的行為返回 404。

如何在 Nginx 中配置靜態文件的記憶體?

編輯: 我將以下內容添加到我的http-block 中:

 map $uri $cache_control {
               ~/Website/assets/media/images    "public, no-transform";
       }
       map $uri $expire {
           ~/Website/assets/media/images   365d;
       }

在我的server-block 中添加了以下內容:

expires $expire;
               add_header Cache-Control $cache_control;

沒有任何東西被記憶體。

如果您不能像@TeroKilkanen 建議的那樣通過 nginx 直接從文件系統提供靜態資產,您可以使用類似於答案中所示的技術:

map $uri $expire {
   ~\.(?:j|cs)s$                      180d;
   ~\.(?:jpe?g|png|webp|woff2?|ttf)$  365d;
   default                            off;
}
map $uri $cache_control {
   ~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$  public;
}
server {
   ...
   expires $expire;
   add_header Pragma $cache_control;
   add_header Cache-Control $cache_control;
   ...
}

如果您的請求 URI 與正則表達式不匹配,則$cache_control變數將具有空值,並且 nginx 根本不會在其響應中添加Pragma和標頭。Cache-Control

引用自:https://serverfault.com/questions/1091739