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

相关推荐
打工的小王14 小时前
nginx(一)nginx简介
nginx
李少兄17 小时前
深入解析 Nginx 413 Request Entity Too Large 错误
运维·nginx
漏刻有时20 小时前
宝塔服务器被篡改 Nginx Location 配置的安全风险剖析与修复指南(流量劫持、服务器资源消耗、站点功能异常、溯源困难)
服务器·nginx·安全
你知道“铁甲小宝”吗丶20 小时前
nginx代理ip哈希用法
nginx·哈希算法
代码的奴隶(艾伦·耶格尔)1 天前
Nginx
java·服务器·nginx
液态不合群1 天前
Nginx多服务静态资源路径冲突解决方案
运维·nginx
岁岁种桃花儿1 天前
详解kubectl get replicaset命令及与kubectl get pods的核心区别
运维·nginx·容器·kubernetes·k8s
zbguolei1 天前
CentOS 7.6离线安装Nginx
linux·nginx·centos
倒流时光三十年2 天前
阿里云 CentOS 7 使用 docker 安装 Nginx
nginx·阿里云·docker·centos
羱滒2 天前
Docker Compose + Nginx + 后端服务运行环境搭建全流程指南(redis、mongdb、nginx、nacos-registry)
redis·nginx·docker·docker-compose