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: 我是地霊殿__三無,希望能帮到你。

相关推荐
苹果醋313 小时前
Golang的文件加密工具
运维·vue.js·spring boot·nginx·课程设计
苹果醋31 天前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
苹果醋31 天前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
阿松哥哥20182 天前
linux环境使用源码方式安装nginx(centos)
linux·nginx·centos
与君共勉121382 天前
Nginx 负载均衡的实现
运维·服务器·nginx·负载均衡
okok__TXF2 天前
Nginx + Lua脚本打配合
nginx·lua
青灯文案12 天前
前端 HTTP 请求由 Nginx 反向代理和 API 网关到后端服务的流程
前端·nginx·http
小屁不止是运维2 天前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
恩爸编程2 天前
探索 Nginx:Web 世界的幕后英雄
运维·nginx·nginx反向代理·nginx是什么·nginx静态资源服务器·nginx服务器·nginx解决哪些问题
努力--坚持2 天前
电商项目-网站首页高可用(一)
nginx·lua·openresty