Laravel单独设置/tpv为HTTP、其余为HTTPS的解决方案
嘿,我来帮你搞定这个循环重定向的问题!核心问题出在你当前的Nginx配置里,/tpv和/index.php/tpv的规则互相触发了重定向循环,而且默认的location /把所有请求都往HTTPS转,刚好挡住了Redsys需要的HTTP回调路径。下面给你两个可行的解决方案,优先推荐第一个,效率更高:
方案一:修正Nginx配置(最直接高效)
你不需要额外创建外部PHP脚本,只需要调整Nginx规则,让/tpv相关的请求直接交给Laravel处理,同时跳过HTTPS重定向。替换你当前的Nginx配置为以下内容(注意调整PHP-FPM的路径为你实际的版本):
server { listen 80; listen [::]:80; server_name .example.com; root /home/forge/example.com/public; # 直接处理/tpv路径的请求,交给Laravel路由处理 location /tpv { try_files $uri $uri/ /index.php?$query_string; } # 处理直接访问/index.php/tpv的情况,避免循环 location ~ ^/index.php/tpv { fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # 替换为你的PHP-FPM路径 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 其他所有路径统一重定向到HTTPS location / { return 301 https://$host$request_uri; } }
配置说明:
location /tpv:用try_files遵循Laravel的路由逻辑,先检查是否有静态文件,没有就转发给index.php处理,不会触发重定向。location ~ ^/index.php/tpv:正则匹配直接访问index.php/tpv的请求,直接交给PHP-FPM处理,避免循环重定向。- 原来的错误是把
/tpv重定向到/index.php/tpv,而后者又被自身规则再次重定向,导致无限循环,现在改成直接处理就解决了这个问题。
方案二:Laravel中间件控制重定向(备选)
如果你不想修改Nginx配置,可以在Laravel层面通过中间件来控制重定向逻辑,只对非/tpv的路径强制HTTPS:
创建自定义中间件:
在终端运行命令生成中间件:php artisan make:middleware RedirectToHttpsExceptTpv编写中间件逻辑:
打开app/Http/Middleware/RedirectToHttpsExceptTpv.php,修改handle方法:public function handle(Request $request, Closure $next) { // 只对非/tpv开头的路径,强制重定向到HTTPS if (!$request->is('tpv*') && !$request->secure()) { return redirect()->secure($request->getRequestUri()); } return $next($request); }注册中间件:
打开app/Http/Kernel.php,把这个中间件添加到web中间件组(或者全局中间件,根据你的需求):protected $middlewareGroups = [ 'web' => [ // ...其他中间件 \App\Http\Middleware\RedirectToHttpsExceptTpv::class, ], ];调整Nginx配置:
要让这个方案生效,需要把原来Nginx里的HTTPS重定向规则去掉,改成让所有请求都交给Laravel处理:server { listen 80; listen [::]:80; server_name .example.com; root /home/forge/example.com/public; location / { try_files $uri $uri/ /index.php?$query_string; } # PHP处理规则 location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
方案对比:
- 方案一(Nginx层面):效率更高,因为重定向在Web服务器层面处理,不需要请求到达Laravel应用,适合生产环境。
- 方案二(Laravel层面):更灵活,适合需要在应用内动态控制重定向规则的场景,但性能略逊于Nginx直接处理。
内容的提问来源于stack exchange,提问作者TrOnNe
相关产品推荐
相关产品推荐

