php - Laravel 403 无效签名仅在 Nginx Web 服务器上
问题描述
问题
我正在通过从 laravel签名路由文档中复制和粘贴的 laravel 'temporarySignedRoute' 函数创建一个签名 URL,在我的 Web 服务器上,该 URL 出现 403 无效签名。签名的 URL 在我的本地计算机上工作,但在将其上传到我的测试服务器后,它会给出如下所示的错误。
我试过的
我一直在寻找解决方案一段时间,并尝试了许多已在堆栈溢出上发布的解决方案,但似乎没有解决我的问题。
我已经尝试了以下所有方法:
- 强制通过 AppServiceProvider 到 https 的所有路由,这会强制所有 url 为 https 但给出相同的结果。
我尝试按照此处所述更改 Nginx 的配置。
我还尝试添加 TrustProxies 中间件,其代理配置为 '*' 或全部,如 laravel 关于Trust Proxies的文档中所述,结果相同。
阻止 Web 服务器强制域使用 https 以测试它是否只是 https 导致的,结果相同。
- 更新 -
我vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php
试图在项目中寻找任何线索时进入。我决定将它在本地和托管项目中比较的令牌数据转储(dd)出来,这就是结果。代码如下所示。
public function hasValidSignature(Request $request, $absolute = true)
{
$url = $absolute ? $request->url() : '/'.$request->path();
$original = rtrim($url.'?'.Arr::query(
Arr::except($request->query(), 'signature')
), '?');
$expires = $request->query('expires');
$signature = hash_hmac('sha256', $original, call_user_func($this->keyResolver));
dd($signature . " :: " . $request->query('signature', ''));
return hash_equals($signature, (string) $request->query('signature', '')) &&
! ($expires && Carbon::now()->getTimestamp() > $expires);
}
本地项目
托管项目
所以令牌没有在我的网络服务器上传递,而是在我的本地。我注意到的另一件事是 Web 服务器令牌始终相同,并且无论如何都不会更改。
我当前的 Nginx 配置可以在这里查看。
我当前的虚拟主机配置在这里。
解决方案
我认为这可能是问题所在。尝试将配置文件中的位置块更改为
try_files $uri $uri/ /index.php?$query_string;
我认为您错过了index 和 query string?
之间的问题。
更新这个并确保重新加载你的 Nginx 服务器。
sudo service nginx reload
让我知道这个是否奏效。
推荐阅读
- html - HTML/CSS 按钮有效,但除非刷新页面,否则不会显示任何效果
- html - 当我悬停一个弹性项目时如何实现这一点?
- typescript - 如何在 node_modules 中键入 JS 文件?
- iis - IIS 和证书,仅使用 netBOIS 名称保护本地访问的网站
- d3.js - 为什么 stack() 不在 d3.js 中创建访问器?
- android - 如何在 Kotlin 中合并流和通道?
- sed - 如何使用 sed 替换 config.yml 中以某种模式开头的特定值
- python-3.x - Elasticsearch 中的通配符搜索 - Python
- python - 输入后换行
- c# - 如何通过单击按钮执行方法