请求方法说明客户端要求服务器做什么。只读文件源站的契约很窄,但仅凭“静态站点”并不能证明代理或导入的处理器没有暴露写操作。应检查真正服务该资源的路由。

语义矩阵区分安全的 GET、HEAD 与不安全但幂等的 PUT、DELETE。限定的 Caddy v2.10.2 文件路径接受 GET、HEAD,以 405 和 Allow 拒绝其他方法,更早应答的处理器可能不同。安全方法仍可产生附带日志;幂等不保证状态码相同,也不意味着每次失败后都适合重试。HEAD 的 Content-Length 若提供须对应同编码 GET,省略可能合法。方法支持与 CORS 权限分开判断。
先区分是否请求改变状态与重复请求的预期效果,再检查实际路由。文件处理器边界有明确适用范围,方法支持与 CORS 权限分开判断。

安全与幂等回答不同的问题

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 权限是两项不同决策。写入拒绝测试应在获准使用的可丢弃夹具上进行,不要因为公共端点看起来静态,就假设向它发送写请求没有影响。

来源