Apache 2.4中PUT与DELETE请求出现405错误的排查求助
我之前也被这个问题折腾过好几个小时!Apache 2.4对PUT/DELETE这类非标准HTTP请求的限制确实有点严格,尤其是默认启用了某些模块的时候。下面是我亲测有效的几个排查方向和解决办法:
检查mod_dir的DirectorySlash设置
Apache的mod_dir模块默认会对带/结尾的URL做301重定向,这个过程会把PUT/DELETE请求转换成GET,直接导致405错误。你可以在httpd.conf或者.htaccess里添加配置关闭这个功能:DirectorySlash Off同时注意你的请求URL结尾不要带多余的
/,避免触发重定向逻辑。用mod_rewrite路由PUT/DELETE请求
如果你的应用需要处理PUT/DELETE,最稳妥的方式是用mod_rewrite把这些请求转发到你的入口脚本(比如PHP、Python的处理文件)。在.htaccess或者虚拟主机配置里添加:RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(PUT|DELETE)$ RewriteRule ^(.*)$ index.php [L]把
index.php换成你实际的应用入口文件即可,这样所有PUT/DELETE请求都会被正确路由到处理逻辑,不会被Apache拦截。排查mod_security的拦截规则
很多服务器默认启用的mod_security会把PUT/DELETE当成潜在攻击行为拦截。你可以先临时关闭mod_security测试是否是这个原因:SecRuleEngine Off如果确认是mod_security的问题,生产环境建议针对性放行,比如移除对应的拦截规则ID(可以从Apache错误日志里找到具体ID):
SecRuleRemoveById 960032确保目录/文件的权限正确
Apache运行的用户(通常是www-data或apache)需要对目标目录有写权限,否则PUT请求无法写入文件、DELETE请求无法删除文件,某些场景下也会返回405错误。可以用以下命令修改权限:chown -R www-data:www-data /path/to/your/target/directory chmod -R 755 /path/to/your/target/directory检查AllowOverride设置
如果你用.htaccess来配置规则,必须确保虚拟主机配置里的AllowOverride设置为All(至少包含FileInfo),否则.htaccess里的重写规则不会生效:<Directory /path/to/your/application/directory> AllowOverride All </Directory>
最后提醒一下:一定要查看Apache的错误日志(通常路径是/var/log/apache2/error.log),日志里会明确说明是哪个模块或者规则导致的405,能帮你快速定位问题!
内容的提问来源于stack exchange,提问作者MikeT

