我目前正在尝试读取我正在使用POST请求调用的PHP脚本中的授权标头。 Authorization标头填充了令牌。似乎Authorization标头在它到达我的PHP脚本之前以某种方式被删除。我正在使用Postman(Chrome插件)执行发布请求,并在我的PHP脚本中启用了CORS。我没有直接访问apache服务器。
HTTP请求:
Accept:*/*
Accept-Encoding:gzip,deflate
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4,ja;q=0.2
Authorization:Bearer mytoken
Cache-Control:no-cache
Connection:keep-alive
Content-Length:32
Content-Type:text/plain;charset=UTF-8
Host:www.myhost.com
Origin:chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/38.0.2125.104 Safari/537.36
PHP脚本:
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Content-Type, Accept");
header("Content-Type: application/json");
$headers = getallheaders();
echo $headers['Authorization'];
以上脚本输出''(=无)。
答案 0 :(得分:79)
经过一段时间后,找到了解决这个问题的方法。不知何故,Authorization标头被剥离了,通过在我的.htaccess中添加以下行,我能够让它工作。
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
答案 1 :(得分:4)
如果您使用 WHM + CPanel + PHP 并且您的显示结果如这里缺少 授权
Array
(
[Host] => domain.com
[Connection] => keep-alive
[Cache-Control] => max-age=0
[Upgrade-Insecure-Requests] => 1
[User-Agent] => Mozilla/5.0
[Accept] => text/html,application/xhtml+xml
[Sec-Fetch-Site] => none
[Sec-Fetch-Mode] => navigate
[Sec-Fetch-User] => ?1
[Sec-Fetch-Dest] => document
[Accept-Encoding] => gzip, deflate, br
[Accept-Language] => en
)
现在只需执行这些步骤。
第一步:.htaccess文件添加
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
第 2 步:添加您的 PHP 文件,如 index.php
1. getallheaders();
2. apache_request_headers();
3. $SERVER['REDIRECT_HTTP_AUTHENTICATION'];
你可以使用任何人。
第 3 步:转到 WHM 面板并进行此导航
Home » Service Configuration » Apache Configuration » Include Editor » Pre VirtualHost Include » All Version
添加这一行
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
并重启Apache服务器(如果不重启服务器则无法正常工作)
第 4 步:我的结果展示
Array
(
[Authorization] => hhRbRZtypswriasabjn3xHT+9Fe9sWHjejhID/YTmookDdrN7WyTUULWwCvmMRiW0RaDRtozLVnvjnl
[User-Agent] => PostmanRuntime/7.26.8
[Accept] => */*
[Cache-Control] => no-cache
[Host] => domain.com
[Accept-Encoding] => gzip, deflate, br
[Connection] => keep-alive
[Content-Type] => application/x-www-form-urlencoded
[Content-Length] => 3
[X-Https] => 1
)
这项工作已经完成。在您完成这些步骤并再次显示相同的错误后,请在此处评论
答案 2 :(得分:3)
下面的数组包含请求标头,$ _SERVER变量
中可能缺少这些标头$headers = apache_request_headers();
(尤其适用于'HTTP_X_REQUESTED_WITH'ajax标头,它将以下列方式找到:
$headers['X_REQUESTED_WITH']
答案 3 :(得分:3)
我必须首先将此添加到我的机器的Apache配置文件中:
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
对于/etc/apache2/apache2.conf
中的Linux
对于/usr/local/etc/httpd/httpd.conf
中的Mac(使用Homebrew)
由于任何原因将其添加到.htaccess中均无效:
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
答案 4 :(得分:1)
我想用一个特定的案例来扩展之前的答案。
我在 AWS (Lightsail) 上使用 LAMP (bitnami)。我的代码是使用 CodeIgniter 3 编写的。所以我已经有了一个 .htacess
文件,其中的内容如下:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
我想实现jimmy's solution:
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
但是怎么样?每个人似乎都在“建议”某事,但并不具体。有多个重写条件/规则似乎有问题。我不是 Apache 专家,所以我必须进行试验。我设法通过以下方式使其工作:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
现在,"HTTP_AUTHORIZATION"
数组中有一个 $_SERVER
键。
编辑:似乎还有另一个具有相同值的键 "REDIRECT_HTTP_AUTHORIZATION"
。
答案 5 :(得分:0)
我不知道为什么我在NGINX上运行的php 5.4.45拒绝任何包含下划线的自定义标头:
<强> ACCEPTED 强>: CURLOPT_HTTPHEADER =&gt;数组('授权:123456')
<强> REFUSED 强>: CURLOPT_HTTPHEADER =&gt;数组('my_Authorization:123456')
我希望它可以帮助别人。干杯
答案 6 :(得分:0)
欺骗了httpd.conf文件后,此解决方案(上述)对我有用:
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
要执行此操作,httpd.conf必须在我的“别名”部分中包含以下指令:
AllowOverride All
Options FollowSymLinks
第一个太开放了(是的,我知道),但是如果您将AllowOverride None设置为.htaccess,则完全可以避免。
此外,如果您不使用FollowSymLinks(基于Apache文档),也可以避免使用RewriteRule
答案 7 :(得分:0)
就我而言,如果在$ _SERVER [“ REDIRECT_HTTP_AUTHORIZATION”]中找到它