405状态码表示服务器理解请求但该资源不支持当前HTTP方法;静态目录下出现POST导致的405,通常暴露非法探测或配置错误,需结合错误日志、access.log及响应头Allow字段综合研判,并通过限流、目录权限加固或WAF规则优化处置。

405 状态码本身不表示“非法”,而是明确说明:服务器理解请求,但该资源不支持当前使用的 HTTP 方法。当它出现在静态资源目录(如 /static/、/images/、/css/)下,且请求方法为 POST,基本可判定为非正常行为——因为静态文件(.html、.jpg、.js、.css 等)在标准 Web 服务器配置中从不接受 POST 请求。
确认日志中 405 来自静态目录
在 Web 服务器错误日志(如 Nginx 的 error.log 或 Apache 的 error_log)中筛选含 405 和对应路径的条目:
- 搜索类似
"POST /static/upload.php HTTP/1.1" 405或"POST /images/logo.png HTTP/1.1" 405的记录 - 重点看请求路径是否落在纯静态目录下(无后端脚本扩展名,或虽有 .php 但实际未启用 PHP 解析)
- 检查响应头中是否有
Allow: GET, HEAD字段,这是服务器明示只允许读取方法的直接证据
识别可疑模式而非单次请求
单个 405 不代表攻击,但批量出现可能暴露探测或误用行为:
- 同一 IP 在短时间内对多个静态路径(如
/css/style.css、/js/main.js、/favicon.ico)发起 POST - 请求携带非常规头部,如
Content-Type: application/x-www-form-urlencoded或非空Content-Length,但目标却是图片或 CSS 文件 - URL 中包含明显表单参数痕迹,例如
?action=upload&file=test.jpg,却发往静态路径
结合访问日志交叉验证
仅看错误日志不够,需关联 access.log 中的原始请求行:
- 提取 405 日志中的时间戳和请求 ID(如有),去 access.log 查找同一时刻的完整请求行
- 确认是否真为客户端主动 POST,而非前端 JS 错误调用(如 fetch 误配 method)、爬虫试探、或 WAF 拦截后伪造的 405(阿里云 WAF 在拦截恶意 POST 到静态路径时会返回 405)
- 若发现大量来自不同 IP、相同 User-Agent(如 python-requests/2.xx)、相似 payload 的 POST,高度疑似自动化扫描或攻击尝试
针对性加固建议
确认是恶意探测后,不单靠日志分析,要落地防护:
- 在 Nginx 中对静态目录显式禁用非安全方法:
location ^~ /static/ { limit_except GET HEAD { deny all; } } - Apache 下使用
LimitExcept GET HEAD> deny from all - 检查是否误将上传入口(如
/static/upload.php)暴露在静态目录下——应移至独立可执行目录,并限制访问权限 - 若使用 WAF(如阿里云),在日志服务中查到具体规则 ID 后,可将该类 POST 静态路径行为加入自定义 ACL 黑名单,或调整 CC 防护阈值











