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)
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)
下面的数组包含请求标头,它可能在 $_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)
这项工作已经完成。在您完成这些步骤并再次显示相同的错误后,请在此处发表评论
| 归档时间: |
|
| 查看次数: |
34194 次 |
| 最近记录: |