Nginx 配置避坑笔记
这周改配置踩了三个坑,记下来备忘。
1. try_files 回退后 location 会重新匹配
想在某个路径下跑 PHP 程序,写了:
location ^~ /admin {
root /var/www/app/public;
try_files $uri $uri/ /index.php?$query_string;
}
结果一直 404。原因是 try_files 回退到 /index.php 时,请求会按 /index.php 这个 URI 重新走一遍 location 匹配,落到了别的 location 上,root 也变了。
解决办法:加一个精确 location 把它接住:
location = /index.php {
root /var/www/app/public;
fastcgi_pass unix:/run/php-fpm/www.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
2. sub_filter 解决混合内容
网站上了 HTTPS,但页面里的图片 URL 是历史数据写死的 http://,浏览器直接拦截不加载。又不想动数据库。
nginx 的 sub_filter 可以在响应里实时替换:
sub_filter 'http://old.example.com/' 'https://new.example.com/';
sub_filter_once off;
注意两点:sub_filter_once off 才会替换所有出现;如果后端开了 gzip,替换会失效,需要先关掉压缩。
3. 静态资源缓存
location ~ ^/(uploads|assets)/ {
expires 7d;
access_log off;
}
静态资源加长缓存 + 关访问日志,省流量也省磁盘。改版的时候记得给文件名带版本号,不然用户端缓存刷不掉。