apache+php 无法获取 header 的Authorization数据
原因和解决办法
换了新的电脑,装了最新版的 MAMP ,一切都是非常新,出现了一个诡异的 bug:`$_SERVER['HTTP_AUTHORIZATION']` 竟然只有这个Authorization无法获取到参数。
环境:Apache ,**采用 fastcgi 模式**,php 7.4。
结论是:没有开启CGIPassAuth on
。修改 httpd.conf
<IfModule mod_fastcgi.c>
<Directory "/Applications/MAMP/fcgi-bin/">
SetHandler fastcgi-script
Options +ExecCGI
CGIPassAuth On # 加上这行,明确开启CGIPassAuth
</Directory>
</IfModule>
CGIPassAuth
是 Apache HTTP 服务器中的一个指令,它用于控制是否将 HTTP 授权头(如 Authorization
)传递给作为 CGI 脚本执行的程序。这个指令在处理 HTTP 认证,特别是基本认证(Basic Authentication)时非常重要。
如何避免此类的问题?
Authorization 这个请求头,算是比较权威的 header, 像 Apache 这种针对这个字段会有特殊的功能实现,例如基本认证Basic Authentication。做业务的时候,最好直接避开这类字段,不要用 Authorization 来实现Token 用户凭证的标识,换个字段,例如 Token。
启示
这问题解决的过程才是写本文的原因。
首先,一开始我并没有意识到是个运行环境的问题,而是认为 apifox(请求客户端) 的问题。换用 curl 请求才认为是 apache+php 的问题。
毫无头绪的时候,问了 chatgpt 4o:php 无法获取到 header=Authentication 数据可能是什么原因。chatgpt 只是罗列了所有原因,里面包含了配置问题。但是没有明确指出是 CGIPassAuth 的原因。
也查过 google ,找到类似的问题,在修改 .htaccess
文件,调整改写规则也无法解决。
进一步确认了是 apache 问题,扔了整个 httpd.conf 文件给 chatgpt , 文件内容太长无法读取。
骚操作来了:kimi 适合长文本,于是我先让 kimi 帮我处理 httpd.conf 上的注释。命令:于以下的 apache 配置 httpd.conf 文件。帮我去掉里面的注释,返回去注释的后的文件配置。
正确地处理后,我发了 prompt:根据上面的配置,我的 php 项目无法获取到 http 请求头Authorization 的数据,是上面哪个配置的原因?如果上面的配置参考不足,你告诉我还需要提供什么内容。
竟然直接指出了是`CGIPassAuth` 配置问题,完美地解决了问题。