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
相关产品推荐
相关产品推荐

