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

相关推荐
ajsbxi1 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
JustCouvrir20 小时前
macOS|前端工程部署到Nginx服务器
服务器·前端·nginx
AlbertS21 小时前
使用 Let’s Encrypt 获取免费SSL证书
nginx·免费·centos7·ssl证书·let’s encrypt
航月21 小时前
FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
nginx·docker·mariadb
IT-民工211101 天前
nginx监控指标有哪些
运维·nginx
陌路物是人非1 天前
docker对nginx.conf进行修改后页面无变化或页面报错
nginx·docker
草明2 天前
Nginx 做反向代理,一个服务优先被使用,当无法提供服务时才使用其他的备用服务
运维·nginx·github
吉吉612 天前
Nginx:我自己的网站
运维·nginx
凉忆-2 天前
nginx安装ssl模块教程
运维·nginx·ssl
俎树振2 天前
树莓派上安装与配置 Nginx Web 服务器教程
服务器·前端·nginx