Laravel 获取请求头
Posted
技术标签:
【中文标题】Laravel 获取请求头【英文标题】:Laravel get request headers 【发布时间】:2014-01-18 04:03:08 【问题描述】:我正在使用 POSTMAN 向 api 发送一个 GET 请求,其中包含 Authorization 的标头。
我知道数据头可以正常工作,因为如果不正常,路由会返回 401 错误。
我想像这样获得授权标头:
$access_token = Request::header('Authorization');
但注意到它返回 NULL。
所以我尝试通过以下方式获取值:
die(var_dump(Request::header()));
并注意到它不包含任何授权标头。只需托管 cookie 标头即可。
更新
应该得到Authorization: Bearer ACCESS TOKEN
【问题讨论】:
【参考方案1】:您使用的是哪个 POSTMAN 版本?
您是在本地机器还是托管服务器上,一些托管公司不允许 AUTHORIZATION HEADER。
.htaccess 修改
RewriteEngine On
RewriteCond %HTTP:Authorization .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
【讨论】:
最新版本。我在我的本地机器上。我稍后会试试这个。 你试试curl -H "Authorization: Bearer <ACCESS_TOKEN>" http://localhost
,只是为了安全起见,这不是邮递员的问题。
感谢这个解决方案,挽救我的生命和时间 :) +1
谢谢..这个解决方案帮助了我但是你能解释一下这段代码到底是做什么的吗?因为我不太了解 Htaccess 命令
@SameerShaikh 代码通过显式映射到环境变量 _ HTTP_AUTHORIZATION_ 来转发 HTTP 授权标头。有关此类“Htaccess 命令”的更多信息,请查看 Apache 模块 mod_rewrite 的文档。【参考方案2】:
dschniepp 的回答是对的,但我也有这个问题。你必须做两件事:
-
检查 mod_rewrite 是否可用并已激活。
更新 Laravel 的 .htaccess 文件,位于 public 文件夹中。
首先,您必须检查“mod_rewrite”模块是否可以通过 php_info 函数在单独的 php 文件中使用。然后,如果它可用,您必须激活它,这取决于您的网络服务器的配置,在我的 Nitrous 框中,我将这些行添加到我的 httpd.conf 文件中:
<IfModule mod_rewrite>
RewriteEngine On
</IfModule>
或者您也可以在 .htaccess 文件中激活模块:
RewriteEngine On
然后在位于 laravel 应用程序根目录的 public 文件夹中的同一个 .htaccess 文件中,您必须添加以下行:
RewriteCond %HTTP:Authorization ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
这些行对我有用。您的 .htaccess 文件应如下所示:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %HTTP:Authorization ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.php [L]
</IfModule>
就是这样,您应该在 Request::header() 数组中拥有 Authorization 标头。只是为了澄清这些是 Apache 的问题,而不是 Laravel 本身的问题。
【讨论】:
【参考方案3】:在 Laravel 5.5 中,您可以使用 apache_request_headers 读取牧民,只需通过以下几行在您的控制器中读取它
$headers = apache_request_headers();
dd($headers['Authorization']);
确保你已经添加了 use Illuminate\Http\Request;在你的控制器中
【讨论】:
【参考方案4】:Apache 虚拟主机缺少授权标头。
除了上述解决方案之外,罪魁祸首可能是因为 Apache 服务器不允许授权标头通过虚拟主机。
要解决此问题,您必须在虚拟主机配置中添加允许 Apache 将授权标头传递给 PHP 的行。例如。对于 Ubuntu 18.04,虚拟主机在 /etc/apache2/sites-available/your-site-name.conf
、see this tutorial for better context 中定义。
<VirtualHost>
# ...
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
# ...
</VirtualHost>
更新虚拟主机配置后不要忘记重新启动 Apache(再次例如 Ubuntu 18.04 sudo systemctl restart apache2
)。
这应该可以解决问题。
这里是the original answer。
【讨论】:
是的……它对我本地和服务器都有效……谢谢 很高兴为您提供帮助 :)【参考方案5】:在这里发布它,因为它解决了我的问题。这适用于子域,但显然也可以针对普通域进行调整。在顶部的路线文件中应用了这个。
$newUrl = '';
try
$urlParts = parse_url($_SERVER['HTTP_REFERER']) ?? '';
$newUrl = $urlParts['scheme'] . "://" . $urlParts['host'];
if(!stristr($newUrl, '.yourdomain.com'))
$newUrl = 'false';
catch(Exception $e)
header('Access-Control-Allow-Origin: ' . $newUrl);
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: access-control-allow-origin,cache-control,content-type,postman-token');
【讨论】:
以上是关于Laravel 获取请求头的主要内容,如果未能解决你的问题,请参考以下文章