【发布时间】:2019-11-04 09:29:20
【问题描述】:
问题
我正在通过从 laravel signed routes 文档中复制和粘贴的 laravel 'temporarySignedRoute' 函数创建一个签名 URL,在我的 Web 服务器上,该 URL 出现 403 无效签名。签名的 URL 在我的本地机器上工作,但在将其上传到我的测试服务器后,它会给出如下所示的错误。
我尝试过的
我一直在寻找解决方案一段时间,并尝试了许多已在堆栈溢出上发布的解决方案,但似乎没有任何解决方案可以解决我的问题。
我已经尝试了以下所有方法:
- 强制通过 AppServiceProvider 到 https 的所有路由,这会强制所有 url 为 https,但结果相同。
我尝试按照here 的描述更改 Nginx 的配置。
我还尝试添加 TrustProxies 中间件,其代理配置为 '*' 或全部,如 laravel 在 Trust Proxies 上的文档中所述,结果相同。
阻止网络服务器强制域使用 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配置可以查看here。
我当前的虚拟主机配置是here。
【问题讨论】:
-
你能发布你的 Nginx 配置吗?我不确定,但它看起来像是 Nginx 配置中的一个问题。
-
当前 Nginx 配置可以在这里查看。 drive.google.com/file/d/…
-
您使用的是虚拟主机吗?因为上面提到的配置有一个 Root 或 servername 或 Proxy 请求(如果你正在使用) .. ?介意显示虚拟主机的配置吗?还有一件事是本地和服务器的.env有什么区别。我的意思是像 SESSION DRIVER 或 CACHE DRIVER 引擎在两者中都不同?数据库还是文件?
-
服务器端和本地端的 .env 几乎完全相同,减去指向不同 MySQL 服务器的 SQL 服务器的主机名。我使用的是数据库而不是文件。您可以在此处查看虚拟主机。 docs.google.com/document/d/…
-
尝试将您的位置块更改为 try_files $uri $uri/ /index.php?$query_string;我想你错过了'?在索引和查询字符串之间。更新这个并确保重新加载你的 nginx 服务器。 ` sudo service nginx reload ` 让我知道这是否有效。