Laravel应用迁移至Nginx-FPM后出现URL循环重定向问题求助
我正在把一款Laravel应用从Apache迁移到Nginx环境,已经确认PHP-FPM运行正常(可正常访问phpinfo),但配置Laravel的public目录后出现URL循环重定向问题,请求日志中/login的return_url参数不断重复追加:
10.240.0.26 - - [09/Apr/2024:12:49:34 +0100] "GET /login?return_url=/login?return_url=/login?return_url=/login?return_url=/login?return_url=/login?return_url=/login?return_url=/login??return_url=/login?return_url=/login?return_url= HTTP/1.1" 302 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0"
我并非该应用开发者,以下是我在Ubuntu 22.04上的Nginx配置(初始修改版与当前完整版),恳请提供排查思路:
初始修改版Nginx配置
location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/run/php/php7.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # Allow headers add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization' always; }
当前完整版Nginx配置
server { listen 80; server_name console.notlistingmyserver.com; root /data/www/consoleapp/console/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options "nosniff"; index index.php; charset utf-8; try_files $uri $uri/ @rewrite; location @rewrite { rewrite ^/(.*)$ /index.php?_url=/$1; } location ~ \.php$ { fastcgi_pass unix:/run/php/php7.1-fpm.sock; fastcgi_index /index.php; include fastcgi_params; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; } }
排查思路
优先恢复Laravel官方推荐的Nginx重写规则,替换当前的
@rewrite逻辑。官方标准配置为:location / { try_files $uri $uri/ /index.php?$query_string; }当前用
_url参数传递路径的方式,可能和Laravel路由解析逻辑冲突,导致return_url生成异常。检查Laravel应用的
.env文件,确认APP_URL与Nginx的server_name完全一致(比如http://console.notlistingmyserver.com),URL不匹配会导致应用生成跳转链接时出错,触发循环重定向。验证应用登录逻辑:未登录用户访问权限页面时,会跳转至/login并携带return_url。如果应用的return_url生成逻辑未正确处理已存在的参数,就会重复追加。可临时注释权限中间件,测试是否仍出现循环重定向,以此判断是Nginx配置问题还是应用逻辑问题。
检查Nginx的
fastcgi_params文件,确认其中是否已定义REQUEST_URI。当前配置手动添加了该参数,若文件中已有重复定义,可能导致参数值异常,引发路由解析错误。清除Laravel路由缓存:执行
php artisan route:clear,避免缓存的路由规则与当前环境不匹配。
内容的提问来源于stack exchange,提问作者Riaan

