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

求助:.htaccess转Nginx重写规则失效,附根目录规则示例

解决Nginx中.htaccess转换后的URL重写失效问题

先拆解你根目录.htaccess的核心逻辑:它会把所有符合[a-zA-Z0-9-/]+格式的URL——不管结尾带不带斜杠——都转发到index.php?slug=$1,$1就是你URL里那段匹配到的路径内容。

下面是适配Nginx的正确配置写法,你可以把这段内容整合到/etc/nginx/conf.d/domainname.conf的server块中:

server {
    # 先填好你的基础配置(端口、域名、网站根目录、默认索引页)
    listen 80;
    server_name your-domain.com;
    root /path/to/your/script/root;
    index index.php index.html;

    # 处理根目录的URL重写逻辑
    location / {
        # 优先访问真实存在的文件/目录,不存在再走重写规则
        try_files $uri $uri/ @rewrite;
    }

    # 单独定义重写规则的命名location
    location @rewrite {
        # 匹配不带结尾斜杠的URL
        rewrite ^/([a-zA-Z0-9-/]+)$ /index.php?slug=$1 last;
        # 匹配带结尾斜杠的URL
        rewrite ^/([a-zA-Z0-9-/]+)/$ /index.php?slug=$1 last;
    }

    # 务必保证PHP文件能正常解析(根据你的PHP版本调整fastcgi_pass路径)
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 示例路径,按实际情况修改
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

几个关键注意点:

  • URL匹配的细节:Nginx的rewrite规则里,URL开头是带/的,和Apache的规则写法有区别,所以要加上^/来准确匹配根路径下的请求。
  • rewrite的flag选择:用last让Nginx处理完重写后重新匹配location,这样才能顺利走到PHP解析的配置块,确保重写后的URL能被正确执行。
  • 真实资源优先:try_files $uri $uri/ @rewrite的作用是,如果用户请求的是真实存在的文件或目录,不会触发重写——这和Apache的默认行为一致,避免误改合法请求。
  • PHP解析配置不能少:如果location ~ \.php$的配置错了,就算重写规则生效,PHP文件也跑不起来,一定要根据自己服务器上的PHP-FPM路径调整。

另外,要是管理目录的.htaccess转换后也有问题,把对应的规则贴出来,我再帮你调整适配Nginx的写法。

配置改完后,记得先执行nginx -t检查语法有没有错,没问题的话再用systemctl reload nginx重启Nginx让配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:07:27