nginx部署前端项目报405错误

前端部署在docker容器的nginx镜像里。这是一个分布式项目。
前端报错信息:
116.23.178.224 - - [08/Sep/2023:08:08:20 +0000] "POST /admin/auth/common/authUser/login.do HTTP/1.1" 405 559 "http://服务器IP:8088/login.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69" "-"
后端报错:

img

default.conf文件配置:

img


已排除post/get方法写错、content-type错误、服务器限制http请求、url写错、端口未开放的原因。

从错误日志中可以看出,问题出现在HTTP请求头的解析上具体来说,报错信息是"Invalid character found in method name.HTTp method names must be tokens",意味着在HTTP请求方法名中找到了无效字符,HTTP方法名必须是标记

这个错误通常是由于HTTP请求格式不正确造成的,可能是在发送请求时故意或无意中插入了一些非法字符或是请求的HTTP方法(如GET、POST等)被错误地拼写了

解决方案如下:

  1. 检查请求的URL和HTTP方法:确认请求的URL和HTTP方法是正确的,没有多余的空格、字符或拼写错误
  2. 确认请求头格式:确保请求头的格式符合HTTP规范,尤其是请求行中的方法和路径部分
  3. 检查客户端代码:如果问题是客户端代码导致的,检查客户端发送请求的代码,特别是HTTP请求方法和头部信息的设置部分,确认是否正确地设置了请求方法和头部信息
  4. 检查服务器端配置:如果问题持续存在,可能是服务器端配置引起的检查Tomcat服务器的配置,确认是否对请求头进行了特殊处理或过滤,如有相应配置,考虑暂时禁用或调整
  5. 考虑使用工具测试:使用Postman或其他HTTP请求工具,手动发送相同的请求到服务器,观察服务器是否能够正确解析请求如果工具发送的请求能够正常解析,那么问题可能出在客户端代码或配置上

以下是示例代码片段,演示了正确设置HTTP请求方法的示例(使用Java的HttpClient):

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        // 设置请求的URL
        String urlString = "http://example.com/api/endpoint";
        URL url = new URL(urlString);
        URLConnection connection = url.openConnection();
        connection.setRequestProperty("Content-Type", "application/json"); // 设置请求头

        // 设置HTTP方法
        HttpURLConnection httpConnection = (HttpURLConnection) connection;
        httpConnection.setRequestMethod("POST"); // 或者根据实际需要设置其他HTTP方法,如GET、PUT等

        // 发送请求并获取响应
        InputStream inputStream = httpConnection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    }
}

【以下回答由 GPT 生成】

这个问题可能是由于Nginx配置中的请求方法限制引起的,可以尝试以下一些解决方案:

  1. 检查Nginx配置文件中的反向代理配置:检查Nginx配置文件中是否正确配置了反向代理,确保代理转发的路径和参数正确。

  2. 检查Nginx配置文件中的请求方法限制:打开Nginx配置文件(通常位于/etc/nginx/nginx.conf), 搜索 location 配置块,并检查是否存在请求方法限制的配置。例如,如果有类似于 limit_except GET POST {...} 的配置,请确保在该配置块中包含了你需要的请求方法。

  3. 检查Nginx配置文件中的反向代理缓存设置:某些情况下,Nginx反向代理缓存可能会导致405错误。你可以尝试禁用或清除缓存。在配置文件中搜索类似于 proxy_cacheproxy_cache_path 的设置,并禁用或清除缓存。

  4. 检查前端应用服务器的配置:如果你的前端项目部署在一个应用服务器上(如Node.js、Java等),请确保应用服务器的配置允许接收POST请求,并且没有对POST请求进行其他限制。

例子:

location / {
    try_files $uri $uri/ =404;
    proxy_pass http://your_backend_server;
}

如果上述解决方案都不能解决问题,可能需要进一步检查你的应用程序代码,尤其是请求处理部分,以确保它正确地处理了POST请求。

希望以上解决方案能够帮助你解决问题。如果没有解决,可能需要进一步调查和排除其他可能的原因。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^