15 10 月 2026

URL 里带 ?p=123 难看、收录差;想旧域名平滑跳新域名;想 HTTP 自动跳 HTTPS;想把动态链接变成静态样式的 SEO 友好地址——这些都是 Nginx rewrite 的活。这篇把 rewrite、return、location 匹配的规则和常见程序(WordPress、Typecho、ThinkPHP)的现成配置讲清。

需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站和游戏服都能快速部署。

一、rewrite、return、location 的分工

指令用途场景
rewriteURL 重写(浏览器地址栏不变)伪静态
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"

排查三连:

  1. nginx -t 过了吗?(语法)
  2. systemctl reload nginx 执行了吗?(生效)
  3. 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→HTTPSreturn 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=123rewrite ^/user/(\d+)$ /user.php?id=$1 last;
禁止访问隐藏文件location ~ /\.(?!well-known).* { deny all; }
上传目录禁 PHPlocation ^~ /uploads/ { location ~ \.php$ { return 403; } }

rewrite 是 Nginx 里最常用的功能,也是坑最多的地方。记住优先级(= > ^~ > 正则 > 前缀)和调试三连(nginx -t、reload、curl -I),没有配不出来的规则。

需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站快速部署。延伸阅读:Nginx 安装与配置入门、Nginx 反向代理与多站点配置、Nginx 负载均衡配置实战。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:CDN 加速配置实战:缓存策略、源站保护、NAT 型适配
  2. 下一篇:网站数据库迁移与换机实战:mysqldump 五步零丢数据
发表评论 1

取消回复