Nginx405 method not alllowed

xiaoxiao2021-02-28  62

当我用nginx 作为文件服务器提供下载服务的时候,正常情况下都可以去下载访问。 之前的方式是用nginx作为前端web服务,然后proxy_pass 代理到后端的apache上面。下载访问量增大的话 会增加内网之间的传输,同时云机内网之间有带宽限制,必然会导致一些访问失败。因此尝试直接把文件放在nginx服务下,使用浏览器访问一切都正常ok 第二天业务的部分量下降严重,排查其中一个业务下载全部失败。问过开发后,发现全部是post请求下载。尝试模拟post请求下载 报错

<html> <head><title>405 Not Allowed</title></head> <body bgcolor="white"> <center><h1>405 Not Allowed</h1></center> <hr><center>nginx/1.0.11</center> </body> </html>

报错405请求方式不被允许,查完资料发现nginx 默认不支持post请求静态文件。同时浏览器默认所有请求都是get方式。现在问题很明确了需要去解决nginx post方式请求静态文件


解决方案一、 既然之前支持post请求 我可以根据request_method 将所有post请求转发至后端apache (这里的post请求量不是很大,影响不是很大)。

upstream fee { server 192168.1.32:80 weight=1 max_fails=3 fail_timeout=10s; } ---------- location /statics/ { access_log logs/down_log re; if ($request_method = POST){ access_log logs/post re; proxy_pass http://fee; } root /source_package/static_file; autoindex on; autoindex_exact_size off; autoindex_localtime on; }

经测试有效,同时可以顺便分离开相应的日志文件,方便统计。 解决方案二、 proxy_pass 转发静态文件接收的POST请求到GET方式

upstream post { server localhost:89; } ............................. error_page 405 =200 @405; location @405 { root /data/www/test/; proxy_method GET; proxy_pass http://post; } ......................... server { listen 89; server_name _; root /data/www/test/; }

经测试有效,这样依赖 也支持cdn下载 方案三、 我查到资料是修改源码 nginx源码目录/src/http/modules/ngx_http_static_module.c

if (r->method & NGX_HTTP_POST) { return NGX_HTTP_NOT_ALLOWED; } 注释掉如下: /*if (r->method & NGX_HTTP_POST) { return NGX_HTTP_NOT_ALLOWED; } */

重新编译configure、make 不要make install make 结束后在/ objs 目录下的 nginx至安装的Nginx目录下,重启Nginx生效 记得备份之前的 /sbin/下的nginx ………………. 经测试成功 以上三种方式,应该还有其他方案 。条条大路通罗马

转载请注明原文地址: https://www.6miu.com/read-44613.html

最新回复(0)