PHP POST请求中缺少授权标头

jim*_*mmy 30 php apache authorization header http

我目前正在尝试读取我正在使用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
Run Code Online (Sandbox Code Playgroud)

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'];
Run Code Online (Sandbox Code Playgroud)

上面的脚本输出''(=无).

jim*_*mmy 101

经过一段时间后,找到了解决这个问题的方法.不知何故,Authorization标头被剥离了,通过在我的.htaccess中添加以下行,我能够让它工作.

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
Run Code Online (Sandbox Code Playgroud)

  • 我对此也很好奇;显然,出于安全原因,Apache 默认情况下不会传递“Authorization”标头。相反,您必须使用“CGIPassAuth”指令手动启用它(大约 2.4.13),该指令在“.htaccess”或目录配置中有效。此功能也适用于以前的版本,但我找不到解释这些旧版本的文档。 (7认同)
  • 4年后的PHP 7.2仍然有意义!很棒的修复! (6认同)
  • 出色的解决方案...现在有人可以解释发生了什么事吗?这只发生在某些服务器上。为什么它会被剥离? (5认同)
  • 我本来要对此表示赞成...然后我意识到我已经有了,这是我上次遇到此问题。 (3认同)
  • 在 Php 5.4 和 Apache 上尝试将 HTTP 基本授权与我的 REST api 一起使用时,我遇到了同样的问题。我已经修改了 .htaccess 文件以支持其余 api 的 RewriteEngine On,类似地,我所有的请求标头似乎都在那里,除了授权,当我在 PHP 中查询它们时。您的修复是正确的,谢谢! (2认同)

san*_*zti 28

解决此问题的最优雅的解决方案是在.htaccess.

CGIPassAuth On
Run Code Online (Sandbox Code Playgroud)

该指令是 apache 核心的一部分,不需要启用任何特殊模块。请参阅此处的文档。

当将 php-fpm 与 apache 一起使用时会出现此问题(与直接在 apache 中使用 php 模块相反)。

这是一项安全措施,可防止敏感数据通过 fcgi 从 apache 传输到 php。

该解决方案不仅修复了$_SERVER["HTTP_AUTHORIZATION"]php$_SERVER["PHP_AUTH_USER"]官方文档中描述的“基本”身份验证中使用的问题。

在我看来,涉及HTTP_AUTHORIZATION通过SetEnvIf或使用RewriteRules 设置环境变量的所有其他解决方案都是解决方法,并不能解决根本问题。

我在 2021 年使用 php7.4 测试了这个解决方案。


Tec*_*mad 17

我首先要将此添加到我的机器的Apache配置文件中:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
Run Code Online (Sandbox Code Playgroud)

对于Linux /etc/apache2/apache2.conf

对于Mac(使用Homebrew) /usr/local/etc/httpd/httpd.conf

出于任何原因,将其添加到.htaccess均无效:

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
Run Code Online (Sandbox Code Playgroud)

  • 您可以在.htaccess中添加`SetEnvIf Authorization“(。*)” HTTP_AUTHORIZATION = $ 1`。那对我有用。 (3认同)
  • 这对我有用。我正在使用 aws lightsail 所以..我在 /opt/bitnami/apache2/conf/httpd.conf 中添加了代码。另外我认为重新启动服务器是必要的。sudo /opt/bitnami/ctlscript.sh 重新启动 apache。 (2认同)

Gri*_* P. 8

下面的数组包含请求标头,它可能在 $_SERVER 变量中丢失

$headers = apache_request_headers();
Run Code Online (Sandbox Code Playgroud)

(对于 'HTTP_X_REQUESTED_WITH' ajax 标头尤其如此,它将通过以下方式找到: $headers['X_REQUESTED_WITH']


小智 5

如果你使用 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
)
Run Code Online (Sandbox Code Playgroud)

现在只需执行这些步骤。

第 1 步:添加 .htaccess 文件

RewriteEngine On

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
Run Code Online (Sandbox Code Playgroud)

第 2 步:添加您的 PHP 文件,如 index.php

1. getallheaders();

2. apache_request_headers();
 
3. $SERVER['REDIRECT_HTTP_AUTHENTICATION'];
Run Code Online (Sandbox Code Playgroud)

你可以使用任何人。

第 3 步:转到 WHM 面板并进行此导航

Home » Service Configuration » Apache Configuration » Include Editor » Pre VirtualHost Include » All Version 
Run Code Online (Sandbox Code Playgroud)

添加这一行

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
Run Code Online (Sandbox Code Playgroud)

并重新启动 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
)
Run Code Online (Sandbox Code Playgroud)

这项工作已经完成。在您完成这些步骤并再次显示相同的错误后,请在此处发表评论