【405】Not Allowed

项目场景:

项目背景:

网站访问失败,请求后端,页面提示 ERROR

浏览器控制台出现如下所示 405 Not Allowed 的错误信息


问题描述

遇到的问题:


原因分析:

问题分析:

第一步 :理解 405 Not Allowed 错误的核心原因
405 错误的本质是:你请求的后端接口地址存在,但服务器不允许你使用当前的 HTTP 方法访问它。

举个例子:后端接口 /api/user 只允许 POST 请求,但你前端用了 GET 去访问,就会报 405。


第二步:排查和解决问题

  1. 先定位具体的错误请求(前端侧)

    在浏览器控制台(F12 → Network 面板)找到报 405 的请求,重点看这 3 个信息:

    • Request URL:请求的接口地址(比如 https://你的域名/api/user)

    • Request Method:使用的 HTTP 方法(比如 GET/POST/PUT/DELETE)

    • Response Headers:看是否有 Allow 字段(这个字段会告诉你服务器允许的方法,比如 Allow: POST, PUT)

  2. 后端侧的常见原因和解决方案

    以下是后端导致 405 错误的高频场景,我现在一一进行排查:
    场景 1:接口方法配置错误(最常见)

    比如 Spring Boot 后端,控制器方法注解和前端请求方法不匹配:

c 复制代码
// 错误示例:后端只允许 GET,但前端用了 POST
@GetMapping("/api/user") // 这里限定了只能 GET
public Result getUser() {
    return Result.success();
}

// 正确示例:如果前端用 POST,后端要对应改成 @PostMapping
@PostMapping("/api/user")
public Result getUser() {
    return Result.success();
}

// 兼容多方法的方案(如果需要)
@RequestMapping(value = "/api/user", method = {RequestMethod.GET, RequestMethod.POST})
public Result getUser() {
    return Result.success();
}
```
---
**场景 2:服务器配置限制(比如 Nginx/Apache)**
如果后端用了 Nginx 反向代理,可能配置了限制 HTTP 方法的规则:


```
# 错误示例:Nginx 只允许 GET/HEAD 方法
location /api/ {
    limit_except GET HEAD {
        deny all;
    }
    proxy_pass http://backend_server;
}

# 正确示例:放开需要的方法(比如 POST)
location /api/ {
    limit_except GET HEAD POST {
        deny all;
    }
    proxy_pass http://backend_server;
}
```
---
**场景 3:跨域配置遗漏(附带导致 405)**
如果是跨域请求,后端跨域配置需要明确允许对应的 HTTP 方法:

``````c
// Spring Boot 跨域配置示例
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("*") // 生产环境要指定具体域名
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 明确允许的方法
                .allowedHeaders("*")
                .maxAge(3600);
    }
}

```

---
**3. 前端侧的临时处理(友好提示)**
即使后端修复了,前端也应该对 405 错误做捕获,避免只显示 ERROR:

``````c
// Axios 请求示例(前端)
axios.post('/api/user', { name: 'test' })
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    if (error.response && error.response.status === 405) {
      alert('请求方式错误,请联系管理员'); // 友好提示
      console.error('405错误:', error.config.method, error.config.url);
    } else {
      alert('请求失败:' + (error.message || '未知错误'));
    }
  });
```

---

# 解决方案:
>解决方案:

按照以上几种情况进行排查,本次问题的原因是 Nginx  的配置问题。进过调整后,网站访问正常。

``````c
server {
    listen 80;
    server_name apiaaa.huidaoyun.com;
    index index.php index.html index.htm default.php default.htm default.html;
   
   location / {
       proxy_pass http://47.111.111.111:8090;
       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;
   }
   # 关键映射:将 /yunyi/upload/ 指向服务器实际存储路径
    location aap/upload/ {
     alias /www/wwwroot/aaa/upload/;
        # 解决跨域(如果前端有跨域问题)
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    }
   
    #禁止访问的文件或目录
    # location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
    # {
    #     return 404;
    # }
    
    # location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    # {
    #     expires      30d;
    #     error_log /dev/null;
    #     access_log /dev/null;
    # }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null;
        }
    
    location ~ /\.
    {
            deny  all;
      }
    access_log  /www/wwwlogs/aaa.com.log;
    error_log  /www/wwwlogs/aaa.com.error.log;
}  
```

# 总结:

1、**核心原因**:前端请求的 HTTP 方法与后端接口允许的方法不匹配。
2、**排查步骤**:先在浏览器 Network 面板定位请求的 URL 和方法 → 检查后端接口注解 / 服务器配置 / 跨域配置 → 确保前后端方法一致。
3、**优化建议**:后端接口文档要明确标注允许的 HTTP 方法,前端对 405 等状态码做友好的错误提示。

如果能提供具体的请求 URL、使用的 HTTP 方法,以及后端的技术栈(比如 Spring Boot/Node.js/PHP),可以给出更精准的修复代码。
相关推荐
_Rookie._1 小时前
npm run 的原理
前端·npm·node.js
未既2 小时前
docker & docker-compose离线部署步骤
java·docker
Zachery Pole2 小时前
JAVA_04_判断与循环
java·开发语言
Volunteer Technology2 小时前
LangGraph的WorkFlow(一)
java·服务器·windows
懒惰成性的2 小时前
11.Java的String类
java·开发语言
FoldWinCard2 小时前
Python 第三次作业
java·服务器·python
傻啦嘿哟2 小时前
Python列表排序:用key参数掌控排序规则
java·开发语言
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue动漫交流与推荐平台系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
大尚来也2 小时前
解决 IDEA 运行 Spring Boot 测试时“命令行过长”错误的终极方案
java·spring boot·intellij-idea