Laravel签署路线在生产中引发InvalidSignatureException

时间:2018-09-07 21:05:48

标签: php laravel

每当我使用 production 上用temporarySignedRoute()创建的URL时,都会抛出InvalidSignatureException。但是,在 dev 环境中,它可以工作。我也尝试过signedRoute()运气不好。

我正在这样创建我的URL:

\URL::temporarySignedRoute(
    'user.activate', 
    now()->addHours(200), 
    [ 'id' => $user->id ]
);

URL的示例:https://xx.xx/activate/5?expires=1537065074&signature=f57713b2fccea5ce17b7c1a3241e275d62f1994cd8004ea480cced2402081090

我确保设置了APP_KEY。我不太确定应该采取什么步骤来解决此问题。我正在使用Laravel Forge进行部署。我也在使用负载均衡器,但只有一个应用程序服务器atm。

  

为什么temporarySignedRoute()在生产中会抛出InvalidSignatureException

编辑:

记录请求,我得到以下数据:

// [ $expired, $url, $query, $original, $signature ]
[
 false,
 "http://xx.xx/activate/13",{"expires":"1537076308","signature":"9d972a574137bf7e5f30120c3f539a81bca71875020c3476e3bfb230220a73f7"},
 "http://xx.xx/activate/13?expires=1537076308",
 "ed80a6ae717e806fd5f887224c2ac88f5fffb893ae284cc52688ba0690d3a9e1"
]

请注意,URL以http://开头,但是实际生成的链接使用的是https://。该URL用request()->url()记录。这使我相信问题出在http方案中。

在我的AppServiceProvider.php中,我像这样强制使用https:

if (env('APP_ENV') == 'production') {
    \URL::forceScheme('https');
}

为什么request()以非HTTP的方式接收它?

2 个答案:

答案 0 :(得分:1)

这是由于我的负载均衡器未向服务器发送HTTPS调用引起的。这意味着服务器正在对与原始(https)不同的URL方案(http)进行哈希处理。

答案 1 :(得分:0)

我遇到了同样的问题,弗雷德里克的回答很有帮助。

当我在生成签名的URL时转储请求时,我看到我的服务器是从“ http”而不是“ https”请求的,即使该站点是通过“ https”提供的。我必须更改Cloudflare设置以对请求强制使用https ...