首页 > 解决方案 > Laravel GET 请求变量与 url 混淆

问题描述

在 Laravel 5.7 Facebook Socialite 登录中观察 GET 请求的奇怪行为。突然停止工作,这是我发现的:

  1. 在用户单击登录时,使用 facebook 重定向正常工作,返回code到我的回调函数的 url 中的 get 变量,如下所示:

请求网址:

https://mysite.loc/callback?code=AQD3hC5MTa&state=TvFnYlXwfJsqKm6ZoDbC

Request Method: GET
Status Code: 200 OK

查询字符串参数

code: AQD3hC5MTaJe
state: TvFnYlXwfJsqKm6ZoDbC6I9IaIYWDT4vgvxxx3P4

到目前为止一切顺利,现在到我的回调函数中调试奇怪的东西:

var_dump(\Request::input());

产生:

array (size=2)
'//callback?code' => string 'AQD3hC5MTaJe' (length=344)
'state' => string 'TvFnYlXwfJsqKm6ZoD' (length=40)

社交名流希望代码可以在

 \Request::input('code')

这不是我的情况

\Request::input('//callback?code')

我见过的最奇怪的事情。我在运行 Linux 的 Docker 上使用 NGINX。路线:

Route::get('/redirect', 'SocialAuthFacebookController@redirect');
Route::get('/callback', 'SocialAuthFacebookController@callback');

函数签名:

public function callback(SocialFacebookAccountService $service);

更新

Nginx Vhost 有:

location / {
    try_files $uri $uri/ /index.php?/$request_uri;
}

更新为:

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

这让事情变得更好了,现在调试的结果是:

array (size=2)
'/callback?code' => string 'AQD3hC5MTaJe' (length=344)
'state' => string 'TvFnYlXwfJsqKm6ZoD' (length=40)

注意回调前面少了一个斜线,但它仍然确实存在......应该只是代码和状态变量。任何人都可以发现我在虚拟主机上做错了什么?看起来库存标准...

我被困在如何进一步调试请求失败的想法上,显然也不愿意更改社交名流代码。已尝试通过查询和输入进行访问-结果相同...

更新

下面的答案是正确的。编辑 Nginx Vhost 以反映已解决的问题:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

令人难以置信的是,在网上找到的使用 Laravel 设置 Nginx 的任何教程都有错误的设置。很高兴在这里收集这些信息。

标签: laravellaravel-socialitelaravel-request

解决方案


这是将请求重定向到public/index.phplaravel 的问题。

它要么在 nginx 的 vhost 声明中,要么在你的 .htaccess 中

基本上,它越来越https://mysite.loc/callback?code=AQD3hC5MTa&state=TvFnYlXwfJsqKm6ZoDbC

将其重定向到

https://mysite.loc/index.php?//callback?code=AQD3hC5MTa&state=TvFnYlXwfJsqKm6ZoDbC

代替

https://mysite.loc/index.php/callback?code=AQD3hC5MTa&state=TvFnYlXwfJsqKm6ZoDbC

ps:重定向示例中使用的域名和协议https://mysite.loc/只是为了说明。nginx 并没有做到这一点

更新:这是我在我的 nginx 虚拟主机中放入的内容

/index.php$is_args$args

推荐阅读