You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 16 LTS下Nginx重写规则失效,example.com/foo跳转失败

解决Ubuntu 16 LTS默认Nginx重写规则失效的问题

我之前在Ubuntu 16.04 LTS的默认Nginx环境里踩过几乎一模一样的坑——apt装的全新Nginx,重写规则看着配置没问题,但就是不生效,还会返回404提示需要index handler。咱们一步步来排查解决:

先搞懂默认Nginx的配置坑

Ubuntu 16.04通过apt安装的Nginx,默认会启用/etc/nginx/sites-available/default里的配置,这里有两个容易干扰重写逻辑的点:

  • 静态文件优先的处理逻辑:Nginx会先检查请求路径对应的静态文件或目录,找不到才会走你的重写规则
  • 默认的index指令:静态index文件(比如index.html)的优先级比PHP高,可能会拦截部分本该走重写的请求

正确的配置示例(直接替换你的server块)

你需要调整server块的规则顺序,确保重写逻辑能被触发,同时PHP请求能被正确处理:

server {
    listen 80;
    server_name example.com;

    # 你的网站根目录,要和默认配置保持一致
    root /var/www/html;
    # 把index.php放在最前面,确保PHP文件优先被识别
    index index.php index.html index.htm;

    # 先配置PHP处理规则,确保优先级高于重写规则
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # Ubuntu16.04默认是php7.0-fpm,如果你装了其他版本要对应修改
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    # 主location规则:先检查静态资源,不存在则走重写
    location / {
        try_files $uri $uri/ @rewriteIt;
    }

    # 你的重写规则定义
    location @rewriteIt {
        # 精确匹配/foo(兼容带斜杠的/foo/),跳转到test.php,必须用last让Nginx重新匹配location
        rewrite ^/foo/?$ /test.php last;
        # 如果需要更通用的规则(比如所有非静态请求都转test.php),可以用:
        # rewrite ^/(.*)$ /test.php?path=$1 last;
    }
}

关键注意事项

  1. 正则表达式要精准:比如^/foo/?$可以匹配/foo和/foo/两种情况,避免因为斜杠导致匹配失败
  2. 用last而不是break:last会让Nginx在重写后重新匹配location,这样才能触发PHP处理规则;break会直接停止处理,导致重写后的请求无法被PHP解析
  3. 检查配置语法:每次修改后执行sudo nginx -t验证配置是否正确,没问题再重载配置:sudo systemctl reload nginx

排查验证方法

如果还是有问题,你可以先测试重写规则是否被触发:
在@rewriteIt里临时加一条return 200 "Rewrite rule triggered!";,然后用curl -I http://example.com/foo查看响应头,如果返回200,说明重写规则已经生效,问题出在PHP处理环节;如果还是返回404,说明重写规则没被触发,要检查location /的try_files配置是否被其他规则覆盖。

内容的提问来源于stack exchange,提问作者Peter Krauss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:21:09