请求方法说明客户端要求服务器做什么。只读文件源站的契约很窄,但仅凭“静态站点”并不能证明代理或导入的处理器没有暴露写操作。应检查真正服务该资源的路由。
安全与幂等回答不同的问题
GET 与 HEAD 是安全方法:客户端没有请求改变状态的操作。但附带的日志、指标或计费仍可能改变服务器状态。PUT 与 DELETE 按其定义具有幂等语义,却并不安全:重复相同请求的预期效果与执行一次相同。这不要求响应状态码相同,也不意味着每次网络失败后都适合重试。
对只读静态源站:
- GET 获取表示。
- HEAD 描述对应的 GET,但不携带响应内容。
- OPTIONS 询问目标的通信选项;文件处理器可以拒绝它。
- POST / PUT / DELETE / PATCH 不应直接落入成功的文件响应,除非另有明确设计的处理器实现其语义。
Caddy 文件处理器的方法边界
Caddy v2.10.2 的文件服务路径接受 GET 与 HEAD,并以 405 和 Allow: GET, HEAD 拒绝其他方法。重定向、缺失路径、错误处理器与其他配置路由可能更早应答或采取不同处理,因此这不是每个静态网站 URL 的统一响应。
原笔记记录过:
$ curl -s -o /dev/null -w 'OPTIONS -> HTTP %{http_code}\n' -X OPTIONS https://www.xbcatm.com/
OPTIONS -> HTTP 405
这里没有保留原始响应日志,本轮审阅也未重现该在线结果。命令只报告状态码,不能证明必需的 Allow 字段存在,需另行检查。405 表示已知方法不被该目标支持;如果服务器根本不识别或未实现该方法,通常应区分为 501 Not Implemented。
HEAD 一致性允许规范规定的省略
HEAD 应描述与 GET 相同的所选表示,同时省略内容。只有生成内容时才能确定的字段可以省略。如果存在 Content-Length,它必须描述采用相同内容编码的对应 GET 内容长度。
原笔记报告过以下比较:
HEAD content-length: 15890
GET bytes read : 15890
这些历史数字不是固定的期望大小,也不是当前验证结果。仅缺少 HEAD 长度是合法的,提供了错误长度才需要调查。成对探针可参考 head-request-parity 笔记;可下载的 check-http-headers.sh 只检视 GET 响应,并不会自动执行这项比较。
拒绝意外写入,同时说明真实契约
对已识别、但目标不允许的方法,返回 405,并以 Allow 列出实际支持的方法。应用路由的这个列表不一定只包含安全方法。不要为被忽略的写请求返回看似合理的 200 页面。
如果浏览器客户端需要 CORS 预检,应明确配置相应 OPTIONS 行为;方法支持与 CORS 权限是两项不同决策。写入拒绝测试应在获准使用的可丢弃夹具上进行,不要因为公共端点看起来静态,就假设向它发送写请求没有影响。
来源
- RFC 9110 — HTTP Semantics,安全/幂等方法与 HEAD、405、501 语义,已核验 2026-10-15。
- MDN: HTTP 请求方法,方法概览,已核验 2026-10-15。
- curl 手册,方法与响应检视选项,已核验 2026-10-15。
- Caddy v2.10.2 文件服务器源码,文件选取后的方法拒绝,已核验 2026-10-15。
- WHATWG Fetch 标准,CORS 预检处理,已核验 2026-10-15。