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=0
和 Expires: <one day ago>
以及 Pragma: no-cache
附加到响应。
我在浏览器中看到的是设置了Expires
和Pragma
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
在两个位置执行它来解决。
我对我当前的解决方案不是很满意,所以我仍然愿意接受新的或更好的方法。
我有一个 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=0
和 Expires: <one day ago>
以及 Pragma: no-cache
附加到响应。
我在浏览器中看到的是设置了Expires
和Pragma
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
在两个位置执行它来解决。
我对我当前的解决方案不是很满意,所以我仍然愿意接受新的或更好的方法。