nginx 配置post请求转get

一、 记录背景

近期遇到一个请求,默认发的是post请求文件。一开始还以为是旧版的请求文件逻辑,我就随手copy了一下逻辑代码,改了下请求的url地址,就贴进项目里了,十分自信的按下部署键,就下班了,加班是不可能加班的。

结果第二天测试提了一堆bug单给我,这班是少加一点都不行啊。

打开项目测试昨晚的请求功能,发现一直报错,在验证了接口地址、请求方式、请求参数都正确后,我百思不得其解,不知道是哪里出了问题。

在各种断点排查、以及对比旧版代码后,才发现不相同的地方是请求方式,新版用的是post,旧版用的get。

接着又遇到新的问题了,那就是nginx默认为get请求,但是新版请求接口是封装组件里的,不给改(因为是别的组维护的),无奈只能改nginx配置去适配。

但加上我平时nginx用得少,基本是项目起初配置一波后,就老死不相往来的那种了。

这次刚好借着机会,恶补下nginx相关知识。并记录下解决问题的过程,防止老年痴呆、记性不好的我下次还踩同样的坑。

二、解决历程

1、405问题的出现:not allowded

出现这个原因是因为当前接口没有在nginx中配置解析到的路径

例如你通过post访问了xx.xx.x.x/file/info.png 这个静态资源,然而nginx是不允许post访问静态资源,默认是get访问,这也就是我旧版项目没出问题的原因。

因为这个路径并没有在nginx中配置,所以nginx自动匹配到的就是/file/info.png,但是/file/info.png是访问静态资源的,比如info.png这一张图片的,只能通过get方法访问,所以这里就报错405。

2、post转get,顺带强制405错误指向正常

既然报了405,那我们把405强制指向200正常就好啦,顺带修改一下这个报错请求的方式,变成GET请求,转发请求路径还是跟原来一样。

http://static_backend 指的是,路径跟原来一致。

ini 复制代码
error_page 405 =200 @405;  
location @405 {  
    root /srv/http;  
    proxy_method GET;  
    proxy_pass http://static_backend;  
}  

3、完整代码

ini 复制代码
#user  nobody;
worker_processes  4;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    #include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;

    upstream static_backend {  
       server localhost:9999;  
     }  
    server {
        listen       9999;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location /file {
            add_header 'Access-Control-Allow-Origin' $http_origin;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
            alias /file;
            index  index.html index.htm;
       }
       error_page 405 =200 @405;  
       location @405 {  
       root /srv/http;  
       proxy_method GET;  
       proxy_pass http://static_backend;  
   }  
    error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
  }  
}

三、小结

又多学了一点nginx知识,每天学一点,每天成长一点,期待与你共同进步。

ps: 我是地霊殿__三無,希望能帮到你。

相关推荐
时间售卖铺2 天前
Nginx 反向代理
运维·nginx·云原生
life码农2 天前
Nginx location 优先级详解:匹配规则、修饰符与完整代码示例
运维·nginx
爬也要爬着前进2 天前
Prometheus通过Nginx-vts-exporter模块监控nginx服务
运维·nginx·prometheus
溪语流沙2 天前
【Web全栈进阶】Nginx反向代理 + HTTPS:正式上线
前端·vue.js·python·nginx·https·fastapi
无敌糖果2 天前
Nginx 后端error.log疯狂刷盘问题分析
运维·nginx
李纲明3 天前
WordPress 古腾堡点「更新」报「不是有效的 JSON 响应」:我按 REST 接口一路查下来的顺序
运维·nginx·php·wordpress·rest api
你看我名字3 天前
LNMP 生产架构与云运维实践:Nginx、PHP-FPM、MySQL 全链路分析
运维·nginx·架构
疯狂成瘾者3 天前
海康威视 WSS 视频取流原理:6014/559 端口、Nginx 代理与 TLS 证书问题
运维·nginx·音视频
李纲明3 天前
WordPress 首页正常、内页全 404:固定链接与伪静态规则排查步骤(Apache / Nginx)
nginx·apache·wordpress
小天源4 天前
从 Nginx 日志到访问分析:轻量化网站监测服务的架构实践
jvm·nginx·网络安全·架构·网络监控