每当我使用 production 上用temporarySignedRoute()
创建的URL时,都会抛出InvalidSignatureException
。但是,在 dev 环境中,它可以工作。我也尝试过signedRoute()
运气不好。
我正在这样创建我的URL:
\URL::temporarySignedRoute(
'user.activate',
now()->addHours(200),
[ 'id' => $user->id ]
);
我确保设置了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的方式接收它?
答案 0 :(得分:1)
这是由于我的负载均衡器未向服务器发送HTTPS调用引起的。这意味着服务器正在对与原始(https)不同的URL方案(http)进行哈希处理。
答案 1 :(得分:0)
我遇到了同样的问题,弗雷德里克的回答很有帮助。
当我在生成签名的URL时转储请求时,我看到我的服务器是从“ http”而不是“ https”请求的,即使该站点是通过“ https”提供的。我必须更改Cloudflare设置以对请求强制使用https ...