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

Nginx子目录移除尾斜杠遇重定向循环问题求助

解决Nginx子目录尾斜杠移除的循环重定向问题

这个问题我之前踩过坑!核心原因是Nginx的默认目录处理机制和你的rewrite规则撞车了:当你访问不带尾斜杠的存在目录(比如/subfolder)时,Nginx会自动返回301重定向到带尾斜杠的版本;而你加的rewrite ^/(.*)/$ /$1 permanent;又会把带尾斜杠的请求踢回去,一来一回就形成了无限循环,浏览器自然就报“过多重定向”了。

要解决这个问题,得先掐断Nginx自动加尾斜杠的默认行为,再配合移除规则,同时保证目录能正确解析到索引文件。下面是调整后的完整配置:

server {
    # 这里放你的listen、server_name、SSL证书等基础配置...

    # 第一步:移除所有带尾斜杠的目录请求,重定向到不带尾斜杠的版本
    rewrite ^/(.*)/$ /$1 permanent;

    # 保留你原有的PHP请求处理配置
    location ~ \.php$ { 
        include fastcgi_params; 
        include fastcgi.conf; 
        fastcgi_split_path_info ^(.+\.php)(/.+)$; 
        fastcgi_pass unix:/var/run/php-fpm.sock; 
        fastcgi_param SCRIPT_FILENAME /var/www/html/example.com$fastcgi_script_name; 
        fastcgi_param SCRIPT_NAME $fastcgi_script_name; 
        fastcgi_index index.php; 
    } 

    # 保留你原有的移除index.html后缀的规则
    if ($request_uri ~* "^(.*/)index\.html$") { 
        return 301 $1; 
    } 

    # 第二步:修改根目录处理规则,禁用Nginx自动加尾斜杠的行为
    location / { 
        root /var/www/html/example.com; 
        index index.php index.html index.htm; 
        # 关键:用try_files直接尝试解析索引文件,跳过自动重定向
        try_files $uri $uri/index.php $uri/index.html $uri/index.htm;
    }
}

关键配置说明

  • rewrite ^/(.*)/$ /$1 permanent;:这条规则放在server块最前面,会优先匹配所有带尾斜杠的请求(不管是根目录还是子目录),直接301重定向到不带尾斜杠的版本。
  • try_files $uri $uri/index.php $uri/index.html $uri/index.htm;:这行是解决循环的核心!它告诉Nginx:如果请求的$uri不是一个存在的文件,就直接尝试访问$uri路径下的索引文件(比如subfolder/index.php),而不是默认的重定向到subfolder/再解析索引,从根源上避免了和移除规则的冲突。

配置改完后,记得用nginx -t检查语法是否正确,没问题就重启Nginx生效。测试的时候可以清空浏览器缓存,避免旧的重定向缓存影响结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:46:48