URL 里带 ?p=123 难看、收录差;想旧域名平滑跳新域名;想 HTTP 自动跳 HTTPS;想把动态链接变成静态样式的 SEO 友好地址——这些都是 Nginx rewrite 的活。这篇把 rewrite、return、location 匹配的规则和常见程序(WordPress、Typecho、ThinkPHP)的现成配置讲清。
需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站和游戏服都能快速部署。
一、rewrite、return、location 的分工
| 指令 | 用途 | 场景 |
|---|---|---|
rewrite | URL 重写(浏览器地址栏不变) | 伪静态 |
return 301/302 | 重定向(地址栏变) | 域名跳转、HTTP→HTTPS |
location | 匹配请求路径,分流处理 | 静态/动态/代理 |
# 改完必须检查语法再重载,错了不重载,老的还能跑
nginx -t
systemctl reload nginx二、Nginx 位置匹配速查
location 匹配规则按优先级:
| 写法 | 匹配 | 优先级 | |
|---|---|---|---|
location = /path | 精确等于 | 最高 | |
location ^~ /path/ | 前缀匹配,命中后不再试正则 | 次高 | |
location ~ \.php$ | 正则区分大小写 | 中 | |
| `location ~* .(jpg\ | png)$` | 正则不区分大小写 | 中 |
location /path | 普通前缀 | 最低 |
记住一条就够:= > ^~ > 正则 > 普通前缀。90% 的「我的规则怎么不生效」都是优先级搞反了——比如先写了 location /,后面加的正则没机会执行。
三、常用 rewrite 模式
3.1 伪静态(动态 URL 转静态样式)
location / {
try_files $uri $uri/ /index.php?$query_string;
}这是 WordPress/Typecho 的标准写法:先找真实文件,找不到全交 index.php,由程序内部路由。
3.2 域名跳转
# 旧域名 301 到新域名(带路径参数)
server {
listen 80;
server_name old.com www.new.com;
return 301 https://www.new.com$request_uri;
}
# HTTP 全跳 HTTPS
server {
listen 80;
server_name new.com www.new.com;
return 301 https://$host$request_uri;
}变量速查:$host 域名、$request_uri 带参数的完整路径、$uri 不含参数的路径。HTTPS 跳转配套证书见SSL 证书与 HTTPS 部署。
3.3 目录与文件重写
# /user/123 -> /user.php?id=123
rewrite ^/user/(\d+)$ /user.php?id=$1 last;
# 老路径 /old/abc.html 跳到新路径
rewrite ^/old/(.*)\.html$ /new/$1 permanent;
# 手机版跳转(按 UA)
if ($http_user_agent ~* "(android|iphone|ipad)") {
rewrite ^/$ /m/ permanent;
}flag 区别:last 本轮重写完后重新匹配 location;permanent = 301 重定向;break 停止处理当前 location 的 rewrite 指令。
3.4 防盗链
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
valid_referers none blocked server_names *.new.com;
if ($invalid_referer) {
return 403;
}
}更细的限流和防护见Nginx 限速与 CC 防护进阶。
四、主流程序现成配置
4.1 WordPress
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
}后台设置 → 固定链接选「文章名」即启用伪静态。主题和插件见WordPress 搭建与性能优化。
4.2 Typecho
location / {
try_files $uri $uri/ /index.php?$query_string;
}Typecho 本身轻量,配置极简,搭配主题见Typecho 主题选择与插件推荐。
4.3 ThinkPHP / Laravel(PHP 框架)
location / {
try_files $uri $uri/ /index.php/$uri?$query_string;
}注意 PATH_INFO:PHP-FPM 要开 cgi.fix_pathinfo=1,且 location ~ \.php 段要带 fastcgi_param PATH_INFO。安全加固见PHP-FPM 安装与性能调优。
4.4 单页应用(Vue/React)
location / {
try_files $uri $uri/ /index.html;
}所有路径都回 index.html,路由交给前端。
五、调试技巧:rewrite 不生效时
# 1. 看 rewrite 日志(debug 级别,定位到具体规则)
error_log /var/log/nginx/rewrite.log info;
# 2. curl 验证实际行为(看状态码和 Location 头)
curl -I http://new.com/old/test.html
# 3. 检查优先级:是不是被更精确的 location 截胡
nginx -T | grep -A5 "location"排查三连:
nginx -t过了吗?(语法)systemctl reload nginx执行了吗?(生效)curl -I看的返回码对吗?(行为)
六、安全:rewrite 也能埋坑
# 坑1:把 .php 请求都当脚本执行,上传目录别这么配
location ~ \.php$ {
fastcgi_pass unix:/run/php/php-fpm.sock;
}
# 上传目录单独关掉 php 执行:
location ^~ /uploads/ {
location ~ \.php$ { return 403; }
}
# 坑2:隐藏文件暴露
location ~ /\.(?!well-known).* { deny all; }
# 坑3:rewrite 死循环(规则 A 跳到 B,B 又匹配 A)
# 用 last/permanent 分清语义,配 error_log info 看跳转链完整 Web 防护见网站常见漏洞与基础防护和WAF 规则实战。
七、速查表
| 需求 | 写法 |
|---|---|
| 伪静态 | try_files $uri $uri/ /index.php?$query_string; |
| HTTP→HTTPS | return 301 https://$host$request_uri; |
| www 跳主域 | return 301 https://new.com$request_uri; |
| 旧域名跳新域名 | return 301 https://www.new.com$request_uri; |
| /user/123→user.php?id=123 | rewrite ^/user/(\d+)$ /user.php?id=$1 last; |
| 禁止访问隐藏文件 | location ~ /\.(?!well-known).* { deny all; } |
| 上传目录禁 PHP | location ^~ /uploads/ { location ~ \.php$ { return 403; } } |
rewrite 是 Nginx 里最常用的功能,也是坑最多的地方。记住优先级(= > ^~ > 正则 > 前缀)和调试三连(nginx -t、reload、curl -I),没有配不出来的规则。
需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站快速部署。延伸阅读:Nginx 安装与配置入门、Nginx 反向代理与多站点配置、Nginx 负载均衡配置实战。
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复