NGINX 防止缓存某些位置,同时拥有 FCGI

NGINX prevent caching certain locations, while having FCGI

我有一个 Laravel 应用程序。这是我的 NGINX 配置文件:

server {                                                                                                                                                                          
     # Log files for Debugging
     access_log /var/log/nginx/access-test.log;
     error_log /var/log/nginx/access-test.log;                                                     

     # Webroot Directory for Laravel project                         
     root /var/www/html/deploy/website/current/public;             
     index index.php index.html index.htm;

     # Your Domain Name
     server_name test.example.com;

    location / {                                      
            try_files $uri $uri/ /index.php?$query_string;
    }                                    

     # PHP-FPM Configuration Nginx                    
     location ~ \.php$ {                  
             fastcgi_split_path_info ^(.+\.php)(/.+)$;
             fastcgi_pass unix:/run/php/php7.2-fpm.sock;
             fastcgi_index index.php;      
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             include fastcgi_params;
     }          

listen 443 ssl; # managed by Certbot                      
ssl_certificate /etc/letsencrypt/live/test.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/test.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}   

我想在某些位置阻止任何类型的缓存,例如“/submit/*”。

我试着在上面添加这个 location /:

    location ~ /submit {
             expires -1;
             add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0' always;
            try_files $uri $uri/ /index.php?$query_string;
    }    

我还在我的 Laravel 应用程序中添加了一个中间件,添加到 /submit sub-paths,将 Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0Expires: <one day ago> 以及 Pragma: no-cache 附加到响应。

我在浏览器中看到的是设置了ExpiresPragma header,但是Cache-Control不是我指定的,而是设置为max-age=31536000.

我怀疑 NGINX 中的某些东西正在覆盖 header,但我似乎无法通过阅读文档或谷歌搜索找到它。

感谢任何帮助或线索。

顺便说一句,我在 Firefox 中测试页面,同时打开检查器,并在网络选项卡中勾选 Disable cache。所以我总是从服务器看到新鲜的 headers。

您不能在被代理的位置内使用 add_header。在计算响应 headers 时,nginx 位于不同的位置块中。这就是 add_header 的工作原理。

您可以使用 add_trailer (docs here),这应该可以满足您的使用需求

我终于添加了以下位置块:

location ~ /submit {
         expires -1;
         add_trailer 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0' always;
             fastcgi_split_path_info ^(.+\.php)(/.+)$;
             fastcgi_pass unix:/run/php/php7.2-fpm.sock;
             fastcgi_index index.php;
             fastcgi_param SCRIPT_FILENAME $document_root/index.php;
             include fastcgi_params;
}

现在可以按预期工作了。

现在唯一的问题是重复,这可以通过将 fcgi 命令放在一个单独的文件中并 include 在两个位置执行它来解决。

我对我当前的解决方案不是很满意,所以我仍然愿意接受新的或更好的方法。