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

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:

  1. 创建自定义中间件:
    在终端运行命令生成中间件:

    php artisan make:middleware RedirectToHttpsExceptTpv
    
  2. 编写中间件逻辑:
    打开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);
    }
    
  3. 注册中间件:
    打开app/Http/Kernel.php,把这个中间件添加到web中间件组(或者全局中间件,根据你的需求):

    protected $middlewareGroups = [
        'web' => [
            // ...其他中间件
            \App\Http\Middleware\RedirectToHttpsExceptTpv::class,
        ],
    ];
    
  4. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:29:55