首页 > 解决方案 > 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 配置可以在这里查看。

我当前的虚拟主机配置在这里

标签: phplaravelnginxhttps

解决方案


我认为这可能是问题所在。尝试将配置文件中的位置块更改为

try_files $uri $uri/ /index.php?$query_string;

我认为您错过了index 和 query string?之间的问题。

更新这个并确保重新加载你的 Nginx 服务器。 sudo service nginx reload

让我知道这个是否奏效。


推荐阅读