网站出现405怎么解决
405错误说白了就一句话:服务器知道你要干什么,网站但不允许你这么干。出现它跟404不一样,解决404是网站“找不到”,405是出现“找到了,但不让你用这个方法”。解决最常见的网站场景是你用POST请求去访问一个只接受GET的接口,或者反过来。出现浏览器地址栏直接敲URL永远是解决GET,所以如果你在地址栏里访问一个只允许POST的网站地址,405就来了。出现 我上次碰到这个问题是解决调一个第三方支付的回调接口。对方文档写的网站是POST回调,我本地用浏览器直接打开那个URL测试,出现结果405。解决折腾了半小时才反应过来——浏览器发的是GET,接口只认POST。这种错其实挺蠢的,但刚上手的时候真容易犯。 打开浏览器开发者工具,看Network面板里那条请求的Response Headers。如果405来自Nginx或Apache,那问题在服务器配置层面;如果来自你的应用框架(比如Spring、Express、Django),那问题在代码路由层面。这个判断很关键,因为解决路径完全不同。 Nginx返回405的话,Response Headers里通常有 Nginx默认只允许GET和HEAD方法访问静态文件。如果你用POST去请求一个静态资源,Nginx直接甩405回来。解决办法是在location块里加上 Apache的情况类似。如果 这个更常见。拿Express举例: 你定义的是GET路由,但前端用axios.post发请求,Express找不到匹配的POST处理器,默认返回405。改成 Spring MVC也一个道理。 有个容易忽略的点:跨域预检请求。浏览器发POST带自定义Header时,会先发一个OPTIONS请求。如果你的路由没处理OPTIONS,预检就失败了,浏览器可能报405。Express里加一行 有时候代码没问题,是请求发错了。比如表单的method属性写成了 我现在的习惯是:遇到405先看开发者工具里的Request Method,确认实际发出去的是什么方法。十次里有三次是客户端发错了,根本不用动服务器。 看Response Headers判断405来源。看Request Method确认实际请求方法。对照路由配置检查方法是否匹配。检查是否有跨域预检问题。用curl手动发请求验证: 405本身不复杂,复杂的是定位。它不像500那样一堆堆栈信息给你看,就一个干巴巴的状态码。所以排查的时候得有点耐心,一层一层剥。服务器配置、框架路由、客户端请求,三个地方挨个过一遍,基本都能找到。先确认是谁返回的405
Server: nginx。Spring Boot返回405的话,你会看到JSON格式的错误体,里面可能写着"status":405,"error":"Method Not Allowed"。看一眼就知道该往哪个方向查。服务器配置层面的405
limit_except或者直接配置dav_methods。不过说实话,用POST请求静态文件本身就不太正常,先想想是不是URL写错了。<Directory>或<Location>里配了<Limit>指令限制了方法,不在白名单里的请求就会收到405。检查httpd.conf或.htaccess里有没有类似<Limit GET POST>的配置。应用代码层面的405
app.get('/api/user', (req, res) => { ... }); app.post或者app.all就行。@GetMapping标注的方法收到POST请求,Spring的DispatcherServlet会抛出HttpRequestMethodNotSupportedException,最终变成405响应。检查Controller里注解和方法是否匹配。app.options('*', cors())就能解决。客户端这边也别放过
method="psot",浏览器不认识这个值,默认按GET发。或者fetch调用时没写method,默认就是GET。还有axios的axios.post(url)写成了axios.get(url),这种低级错误查起来最费时间,因为你会一直怀疑服务器有问题。几个快速排查步骤
curl -X POST http://your-api.com/endpoint,排除浏览器因素。
-
上一篇
-
下一篇
- 随机阅读
- 搜索
-
- 友情链接
-