一、 记录背景
近期遇到一个请求,默认发的是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: 我是地霊殿__三無,希望能帮到你。