HEAD请求返回404的问题
真实用户的浏览器只会发 GET 和 POST
当普通患者或用户访问医院官网时:
打开网页、查看科室、看专家介绍:浏览器默认发送的是
GET请求。提交挂号、填写表单、登录后台:浏览器发送的是
POST请求。
只要服务器和动易 CMS 对 GET 和 POST 的处理是正常的,真实用户在前端感知不到任何异常,网页能打开,挂号也能提交,业务逻辑自然完美运行。
人类不会手写 HEAD 请求去“看网页”
HEAD 请求在 HTTP 协议中的定义是:“只获取 HTTP 响应头(Header),不需要返回网页正文内容(Body)”。
正常人上网是为了看网页页面,不可能有人用浏览器去发 HEAD 请求来读网页,所以业务层完全不受任何影响。
搜索引擎(如百度 Baiduspider、Googlebot)不是人类,它们是用程序写成的“自动化爬虫”。为了在互联网上高效抓取上百亿的页面,蜘蛛设计了一套极度节省资源和带宽的探活机制。
1. 蜘蛛的“轻量探活”机制(先敲门,再进屋)
在下载一个几百 KB 甚至几 MB 的 HTML 页面之前,百度蜘蛛通常会先向服务器发一个轻量的 HEAD 请求 试探一下。它的目的有两个:
探活(Check Alive):这个页面到底还在不在?状态码是不是
200?校验更新(Check Modified):通过 Header 里的
Last-Modified或ETag检查页面自上次抓取后有没有更新。如果是没更新的旧页面,就直接跳过,节省抓取配额。
2. 状态码是搜索引擎的“最高指令”
搜索引擎蜘蛛是严格按照 HTTP 状态码办事的:
当它发送
HEAD请求探活时,动易后端因为没有映射HEAD路由,直接回复了404 Not Found(页面不存在)。百度蜘蛛收到
404后,它的程序逻辑会立即做出判定:“这个 URL 已经失效/被删除了!”既然已经被判定为死链,蜘蛛就不会再浪费流量去发
GET请求下载网页正文了。
3. 结果:在索引库里直接“拉黑”
搜索引擎会在后台将该 URL 标记为异常死链。
即使你手动去百度站长平台提交这个网址,百度后台的自动化校验脚本用
HEAD一测又是404,提交就会直接失败。长期如此,域名在搜索引擎里的权威度(Site Quality)就会被大幅扣分,导致官网域名彻底无法进入搜索前十名。
处理方式:
把nginx修改成下面格式,将HEAD转成GET:
location / {
# 保持原有的 proxy_pass 配置
proxy_pass http://127.0.0.1:8080; # 换成你的动易后端地址/端口
# 核心安全逻辑:只有当请求是 HEAD 时,才将动作转成 GET
if ($request_method = HEAD) {
proxy_method GET;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}