使用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规则,形成循环:
- 用户访问任意路径 → Nginx重写到
/index.php - PHP处理
/index.php→ 返回303重定向 - 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
相关产品推荐
相关产品推荐

