接口或页面打开时报“禁止 GET 方法调用”,多半是服务端出于安全考虑只允许 POST。实际场景里最典型的是 QQ 邮箱的收信接口、部分短信和实名认证接口,以及用框架做的表单提交。

报错从哪来

这类提示一般有两种来源。一种是程序自己判断了请求方法:

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    exit('禁止 GET 方法调用');
}

另一种是框架的 CSRF 中间件,GET 请求没有通过校验,或者接口只注册了 POST 路由。还有一种情况是 WAF 拦截了带敏感参数的 GET 请求。

先改用 POST

如果确实是你在调接口,把 GET 换成 POST 就行。以 QQ 邮箱为例,收信接口本身就是 POST,用浏览器地址栏直接访问必然报这个错。用 curl 测试:

curl -X POST "https://example.com/api/send" \
  -H "Content-Type: application/json" \
  -d "{\"phone\":\"13800000000\"}"

浏览器里调试可以用 Postman 或者页面上的 fetch 调用:

fetch('/api/send', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ phone: '13800000000' })
})

表单要带方法

HTML 表单默认是 GET,写得不对就会出现参数拼在地址栏、服务端拒绝的情况:

<form action="/api/login" method="post">
  <input name="user">
  <input type="password" name="pwd">
  <button>登录</button>
</form>

框架里还要带 CSRF token,ThinkPHP、Laravel、Django 都要,漏了会报 419 或 403。

自己写的程序想放开 GET

如果接口是你自己维护的,又确实需要 GET,把校验逻辑放宽,但要想清楚:GET 参数会出现在浏览器历史、服务器日志和 Referer 里,涉及密码、身份证号、手机号这类信息不应该用 GET 传输。真正需要改的是调用方式,而不是把校验删掉。

排查清单

  1. 用抓包或开发者工具确认实际发出的方法是不是 POST;
  2. 看服务端日志里的 REQUEST_METHOD;
  3. 检查 Nginx 有没有 405 相关配置和 WAF 规则;
  4. 确认接口文档要求的方法和参数格式;
  5. 跨域调用时预检请求失败也会表现为方法不被允许,查 CORS 配置。