Nginx内部重定向循环与404错误排查求助(Apache反向代理场景)
问题排查与解决:Nginx重定向循环及PHP文件无法加载问题
问题现象
执行curl localhost:81/opt/soa/adminControl/v1/ro42/时,Nginx抛出错误:
rewrite or internal redirection cycle while internally redirecting to "/opt/soa/adminControl/v1/ro42/", client: 127.0.0.1, server: _, request: "GET /opt/soa/adminControl/v1/ro42/ HTTP/1.1", host: "localhost:81"
期望返回/opt/soa/adminControl/v1/ro42/目录下index.php(代码<?php echo "Hello";?>)的内容,但修改try_files配置为$uri$is_args$args =404;后返回404 Not Found。
当前架构
- Apache2监听80端口,作为反向代理将指定路径请求转发至监听81端口的Nginx
- Nginx通过
fastcgi_pass 127.0.0.1:9000处理PHP请求
现有配置文件
File1: /etc/nginx/nginx.conf
events { worker_connections 1024; } http { access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; server { listen 81 default_server; server_name _; location /opt/soa/adminControl/v1/ro42 { try_files $uri $uri$is_args$args; include snippets/fastcgi-php.conf; fastcgi_pass 127.0.0.1:9000; } } }
File2: /etc/apache2/sites-enabled/myPage.conf
<VirtualHost *:80> ErrorLog ${APACHE_LOG_DIR}/errorVH.log CustomLog ${APACHE_LOG_DIR}/access.log combined ServerName 54.172.180.152 DocumentRoot /var/www/userExperience ProxyPass /opt/soa/adminControl/v1/ro42 http://localhost:81 ProxyPassReverse /opt/soa/adminControl/v1/ro42 http://localhost:81 </VirtualHost>
错误原因分析
- 重定向循环原因:原
try_files $uri $uri$is_args$args;配置中,当请求/opt/soa/adminControl/v1/ro42/时,$uri匹配到该目录,但Nginx不会自动查找目录下的index.php,于是尝试第二个参数$uri$is_args$args(即原请求路径),导致重复匹配当前location,形成循环。 - 404原因:修改为
$uri$is_args$args =404;后,Nginx找不到匹配文件时直接返回404,未触发目录索引查找逻辑。 - Apache代理配置问题:ProxyPass规则未保留完整路径,转发到Nginx时丢失了
/opt/soa/adminControl/v1/ro42前缀,导致Nginx无法匹配对应的location块。
解决方法
1. 修正Apache代理配置
修改ProxyPass和ProxyPassReverse规则,添加末尾的/以保留完整请求路径:
ProxyPass /opt/soa/adminControl/v1/ro42/ http://localhost:81/opt/soa/adminControl/v1/ro42/ ProxyPassReverse /opt/soa/adminControl/v1/ro42/ http://localhost:81/opt/soa/adminControl/v1/ro42/
2. 修正Nginx的location与try_files配置
调整Nginx配置,添加目录索引并正确设置try_files,让Nginx访问目录时自动加载index.php:
location /opt/soa/adminControl/v1/ro42 { index index.php; try_files $uri $uri/ /opt/soa/adminControl/v1/ro42/index.php$is_args$args; include snippets/fastcgi-php.conf; fastcgi_pass 127.0.0.1:9000; }
或简化写法(依赖index指令生效):
location /opt/soa/adminControl/v1/ro42 { index index.php; try_files $uri $uri/ =404; include snippets/fastcgi-php.conf; fastcgi_pass 127.0.0.1:9000; }
注意:确保/opt/soa/adminControl/v1/ro42/目录存在且Nginx有读取权限,index.php文件权限设置正确。
3. 重启服务使配置生效
systemctl restart apache2 systemctl restart nginx
内容的提问来源于stack exchange,提问作者eberteo
相关产品推荐
相关产品推荐

