Nginx 配置避坑笔记

运维2026-08-24

这周改配置踩了三个坑,记下来备忘。

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

静态资源加长缓存 + 关访问日志,省流量也省磁盘。改版的时候记得给文件名带版本号,不然用户端缓存刷不掉。

← 返回首页