讨论数量:
开发环境
1. 使用的是apache服务器
2. 本地测试域名配置的是https
3. apache 的 virtual host 中没有开启 SSLEngine on
如果你也是上述开发环境,那么可以打印一下这个值:
$_SERVER['HTTPS'] // 确认值是否为 on,如果是 off 或不存在可以继续往下看
进一步确认
符合以上情况,可以 debug 一下这两个函数中生成出来 url 的值,进行确认
signedRoute(laravel_bbs/vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php:319)
$this->route($name, $parameters, $absolute)
hasCorrectSignature(laravel_bbs/vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php:404)
$queryString = ltrim(preg_replace('/(^|&)signature=[^&]+/', '', $request->server->get('QUERY_STRING')), '&');
我验签失败的问题在于,加密函数 signedRoute
生成出来的 url 是 https://xxx
,而解密函数 hasCorrectSignature
获取到 url 是 http://xxx
。
问题原因
我在项目入口配置了 URL::forceScheme('https')
。
这个方法对 route
方法有效,signedRoute
函数中使用 route
方法生成出来的链接是 https://
。
而hasCorrectSignature
函数中使用 $https = $this->server->get('HTTPS')
进行判断,这不受 URL::forceScheme('https')
影响,生成出来的 url 为 http://
, 两者签名结果不一致。
解决办法:
apache 配置完整的 ssl
推荐文章: