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

使用Nginx部署Docker化PHP应用时出现过多重定向问题求助

PHP应用Docker化后Nginx出现重定向循环问题

问题描述

将PHP应用Docker化并通过Nginx提供服务时,出现localhost redirected you too many times.错误,Docker容器日志显示:

php-fpm      | 172.21.1.2 -  26/Sep/2022:05:48:53 +0000 "GET /index.php" 303

Nginx容器暴露80端口,PHP与Nginx容器共享代码目录,相关配置文件如下:

nginx.conf

server {
    listen 80 default;

    client_max_body_size 308M;

    access_log /var/log/nginx/application.access.log;
    

    root /application/tcf;
    index index.php;

    if (!-e $request_filename) {
        rewrite ^.*$ /index.php last;
    }

    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }
    
}

Docker-compose.yml

version: "3.1"
services:

  mysql:
    image: mysql:5.7
    command: mysqld --user=root
    volumes:
      - ./mysql:/docker-entrypoint-initdb.d
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: "password"
      MYSQL_DATABASE: "database"
      MYSQL_USER: "user"
      MYSQL_PASSWORD: "password"
      MYSQL_ROOT_HOST: "mysql"
    ports:
      - "3306:3306"

  webserver:
    image: nginx:alpine
    # build: ./nginx
    container_name: webserver
    working_dir: /application
    volumes:
      - .:/application
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"

  php-fpm:
    build: ./
    container_name: php-fpm
    working_dir: /application
    volumes:
      - .:/application
      - ./php-fpm/php-ini-overrides.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini

问题分析与解决

核心原因

日志中的303状态码说明PHP应用处理/index.php请求时返回了重定向响应,结合Nginx的rewrite规则,形成循环:

  1. 用户访问任意路径 → Nginx重写到/index.php
  2. PHP处理/index.php → 返回303重定向
  3. Nginx再次处理重定向路径 → 又重写到/index.php,循环往复

解决步骤

1. 排查PHP应用重定向逻辑

检查应用代码中是否存在强制重定向到/index.php的逻辑,比如:

  • 会话验证、权限检查后的错误重定向
  • URL路由配置错误导致的无限循环
  • Docker环境下HTTP_HOST、REQUEST_URI等环境变量取值异常引发的错误重定向

2. 优化Nginx配置

将原有的if (!-e $request_filename)规则替换为Nginx官方推荐的try_files指令,避免if指令的潜在冲突:

server {
    listen 80 default;

    client_max_body_size 308M;
    access_log /var/log/nginx/application.access.log;

    root /application/tcf;
    index index.php;

    # 替换if+rewrite为try_files,逻辑更可靠
    try_files $uri $uri/ /index.php?$query_string;

    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }
}

3. 对齐PHP-FPM工作目录

当前PHP-FPM的working_dir为/application,与Nginx的root路径/application/tcf不一致,可能导致应用路径识别错误,修改docker-compose.yml中php-fpm服务配置:

php-fpm:
    build: ./
    container_name: php-fpm
    working_dir: /application/tcf  # 改为与Nginx root一致的路径
    volumes:
      - .:/application
      - ./php-fpm/php-ini-overrides.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini

同时确保共享目录权限正确,PHP-FPM进程用户(通常为www-data)对/application/tcf拥有读写权限。

4. 查看PHP错误日志定位根源

根据Nginx配置中的日志路径,进入Nginx容器查看PHP错误日志:

docker exec -it webserver cat /var/log/nginx/application_php_errors.log

日志会给出应用重定向的具体原因,帮助精准修复代码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:26:20