Laravel API生产服务器请求Header认证失败问题求助
看起来你的.htaccess规则本身是没问题的——毕竟本地环境能正常运行,问题大概率出在生产服务器的Apache配置或者额外安全模块上。我来给你几个针对性的排查步骤:
先确认核心依赖模块是否启用
你的规则依赖mod_rewrite和mod_env两个模块,生产服务器可能没开启mod_env,导致无法把Authorization头转成环境变量传递给PHP。- 可以通过phpinfo()页面查看「Loaded Modules」列表,确认这两个模块都存在;
- 如果有权限,也可以在服务器终端执行
apachectl -M(或httpd -M)查看已启用模块; - 要是缺了,就在Apache的主配置文件(比如httpd.conf)里添加:
然后重启Apache服务。LoadModule rewrite_module modules/mod_rewrite.so LoadModule env_module modules/mod_env.so
检查是否有安全模块拦截了Authorization头
很多生产服务器会启用mod_security这类安全模块,默认可能会过滤掉Authorization头。你可以先临时在.htaccess里添加规则关闭它测试:<IfModule mod_security.c> SecFilterEngine Off SecFilterScanPOST Off </IfModule>如果测试后认证正常,说明是mod_security的问题,不要一直关闭它,而是去配置里添加允许Authorization头的规则,比如:
SecRuleRemoveById 960015(具体规则ID可能需要看服务器的mod_security日志)
确认虚拟主机的AllowOverride权限
生产服务器的虚拟主机配置里,AllowOverride可能没设为All,导致你的.htaccess规则根本没生效。找到对应虚拟主机的<Directory>配置块,修改成:<Directory /path/to/your/api/project> AllowOverride All Require all granted </Directory>重启Apache后再测试请求。
用代码验证请求头是否真的到达应用
可以在你的index.php开头加一段代码,打印所有接收到的请求头:var_dump(getallheaders()); exit;如果输出里没有Authorization,说明请求在到达PHP之前就被服务器拦截了,得去服务器层面排查;如果有,那可能是后端代码读取头的方式有问题(比如某些PHP环境下需要用
$_SERVER['HTTP_AUTHORIZATION']而不是getallheaders())。备选方案:换用自定义头传递认证信息
如果上面的方法都走不通,可以临时绕一下:前端请求时把Authorization的值放到X-Authorization自定义头里,然后在.htaccess里添加规则把这个头转成HTTP_AUTHORIZATION环境变量:RewriteCond %{HTTP:X-Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:X-Authorization}]后端代码里正常读取Authorization头即可。
内容的提问来源于stack exchange,提问作者Sachin Siwal

