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

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>

错误原因分析

  1. 重定向循环原因:原try_files $uri $uri$is_args$args;配置中,当请求/opt/soa/adminControl/v1/ro42/时,$uri匹配到该目录,但Nginx不会自动查找目录下的index.php,于是尝试第二个参数$uri$is_args$args(即原请求路径),导致重复匹配当前location,形成循环。
  2. 404原因:修改为$uri$is_args$args =404;后,Nginx找不到匹配文件时直接返回404,未触发目录索引查找逻辑。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:50:18