PHP POST请求中缺少授权标头

时间:2014-10-20 22:19:43

标签: php apache http header authorization

我目前正在尝试读取我正在使用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'];

以上脚本输出''(=无)。

8 个答案:

答案 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”]中找到它