nginx 前端POST请求405问题解决与排查过程

时间:2022-12-30 10:44:27

问题描述

在请求时,f12提示POST请求报错405

nginx 前端POST请求405问题解决与排查过程

环境描述

nginx转发至后端nginx,后端nginx转发至后端golang api接口

解决步骤

根据网上方法排查,发现80%以上无非就是以下几个解决方法

方法一:将所有POST 405错误发送到命名位置@app 资料地址:https://distinctplace.com/2017/04/17/405-not-allowed-nginx-fix-post-requests/

server {
listen 80;
root /my/root;
error_page 405 = $uri;
# magic happens here
rewrite ^.*$ /api.json last;
location / {
index index.html;
}
}

方法2:error_page 405 =200 $uri;

server {
listen 80
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 403 /403.html;
# To allow POST on static pages 允许静态页使用POST方法
error_page 405 =200 $uri;
}

还有的网站上写明说需要重新编译nginx,如:https://gist.github.com/zxhfighter/7560812

此种方式经过尝试后,发现问题,查询资料后说明error_page 405 =200 $uri;是将将POST请求转换为GET。https://*.com/questions/24415376/post-request-not-allowed-405-not-allowed-nginx-even-with-headers-included

而使用此方法会出现返回不一致的问题,如这里应返回json文本,此处却是 html的文本,其原因就是因为请求的方式不一致,因返回格式不一致,导致前端报错。

nginx 前端POST请求405问题解决与排查过程   nginx 前端POST请求405问题解决与排查过程

此时尝试其他方法进行解决,将nginx转发配置更改为如下配置

location / {
proxy_pass http://log.xxxx.xxxx.com:81/;
proxy_set_header Host $host;
client_max_body_size 10m;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

之前的配置如下

location /xxx/ {
proxy_pass http://log.xxxx.xxxx.com:81/;
}

这时出现502问题,查看后端nginx发现并无前端的请求,并且后端服务没有问题。使用proxy_pass 中填写的地址用postman模拟是可以正常访问。

nginx 前端POST请求405问题解决与排查过程

经过排查发现,问题的原因是在于 nginx中传递了host,而后端也是nginx反向代理,而此nginx中并无原始请求的host,故报502错误。

proxy_set_header Host $host; 

删除Host的设置,成功返回200,但是有一个问题为,并无返回值。

nginx 前端POST请求405问题解决与排查过程

检查nginx配置,发现nginx代理时使用这种方式时没有传递请求参数的,故没有返回值。 备注:nginx如何转发参数,参考的此篇文章https://codeday.me/bug/20170920/74504.html

location / {
proxy_pass http://log.xxxx.xxxx.com:81/;
proxy_set_header Host $host;
client_max_body_size 10m;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

修改后配置

location ~* ^/xxxxx/(.*)$ {
proxy_pass http://logs.xxx.xxxxx.com:81/$1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

修改完成后,再次访问,发现请求变成GET,查询nginx官网文档,http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method。文档中提到,此时的请求不是客户端的请求,而是反向代理客户端的请求,可以用proxy_method POST;设置请求方式为POST。

最终配置文件如下

location ~* ^/xxxxx/(.*)$ {
proxy_pass http://logs.xxxx.xxxxxxxxxx:81/$1;
proxy_method POST;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

此时,请求正常了

nginx 前端POST请求405问题解决与排查过程

nginx 前端POST请求405问题解决与排查过程的更多相关文章

  1. Nginx解决post请求405问题

    和工商银行的一个合作项目,对方客户端需要请求我们的一个静态页面,但是客户端发送过来的请求方法用的post,日志显示405错误(请求方法错误),正常一个静态页面直接用get请求就可以了,工行那边说写死了 ...

  2. nginx 301跳转https后post请求失效问题解决

    app本地请求是http端口,后来升级https强制301跳转,设置如下 server { listen 80; server name www.XXX.com; rewrite ^/(.*)$ ht ...

  3. Apache 后台服务器(主要处理php及一些功能请求 如:中文url)   Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求)   Lighttpd 图片服务器   总体来说,随着nginx功能得完善将使他成为今后web server得主流。

    Apache 后台服务器(主要处理php及一些功能请求 如:中文url) Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求) Lighttpd 图片服务器 总体来说,随着ngi ...

  4. nginx前端负载,后端apache获取真实IP设置

    原文链接: nginx前端负载,后端apache获取真实IP设置 参考文献: 前端Nginx,后端Apache获取用户真实IP地址  按照第二种方法设置不成功! 网站最前端是nginx,做的PROXY ...

  5. 记一次生产环境Nginx日志骤增的问题排查过程

    摘要:众所周知,Nginx是目前最流行的Web Server之一,也广泛应用于负载均衡.反向代理等服务,但使用过程中可能因为对Nginx工作原理.变量含义理解错误,或是参数配置不当导致Nginx工作异 ...

  6. NGINX前端代理TOMCAT取真实客户端IP

    nginx前端代理tomcat取真实客户端IP 使用Nginx作为反向代理时,Tomcat的日志记录的客户端IP就不在是真实的客户端IP,而是Nginx代理的IP.要解决这个问题可以在Nginx配置一 ...

  7. 修改nginx对http请求数据大小限制

    1. 问题发现 在公司搭建了一个基于mindoc的wiki知识库,用nginx做的反向代理服务器,同事在使用过程中上传某个文件一直失败,于是看着看下mindoc自己的日志文件,发现都是类似于fastd ...

  8. 万字长文!一次性弄懂 Nginx 处理 HTTP 请求的 11 个阶段

    Nginx 处理一个 HTTP 请求的全过程 前面给大家讲了 Nginx 是如何处理 HTTP请求头部的,接下来就到了真正处理 HTTP 请求的阶段了.先看下面这张图,这张图是 Nginx 处理 HT ...

  9. Nginx怎么处理请求的?

    nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的 location,location就是实际地址.   server { # 第 ...

随机推荐

  1. 数据分析之Numpy基础:数组和适量计算

    Numpy(Numerical Python)是高性能科学计算和数据分析的基础包. 1.Numpy的ndarray:一种多维数组对象 对于每个数组而言,都有shape和dtype这两个属性来获取数组的 ...

  2. BZOJ1188 [HNOI2007]分裂游戏(SG函数)

    传送门 拿到这道题就知道是典型的博弈论,但是却不知道怎么设计它的SG函数.看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做. 这道题需要奇特的模型转换.即把每一个石子当做一堆石子,且原来在第i堆 ...

  3. C# .net中cookie值为中文时的乱码解决方法

    一.cookie的名称或子cookie的名称不能为中文,否则无法获得cookie 这个好办,名称不用中文即可 二.cookie的值为中文时候,取cookie的值会出现乱码 解决办法:存取cookie时 ...

  4. 各种数据分析图demo

    极地蛛网图:http://www.hcharts.cn/demo/index.php?p=61 各种数据分析图demo: http://www.hcharts.cn/demo/index.php?p= ...

  5. When cloning on with git bash on Windows, getting Fatal: UriFormatException encountered

    I am using git bash $ git --version git version .windows. on Windows 7. When I clone a repo, I see: ...

  6. Grid分组特性

    Ext.onReady(function () {                Ext.define('personInfo', {                    extend: 'Ext. ...

  7. codeforces 631A Interview

    A. Interview time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  8. asp.net mvc 通过修改路由规则来实现页面的URL多参数传递

    [原文]http://blog.csdn.net/risingsun001/article/details/9068187 修改MVC3中的路由规则 在Global.asax.cs中,修改路由规则 原 ...

  9. 从容器里dump java堆实验探索(原创)

    目标:从docker容器里dump java堆 模拟程序 占用空间500M, 设置启动JVM参数 docker启动命令 (PS:经过测试,至少要650M才能启动容器) 方式1: 通过docker ex ...

  10. vue 项目安装sass的依赖包

    安装sass的依赖包 npm install --save-dev sass-loader //sass-loader依赖于node-sass npm install --save-dev node- ...