Nginx静态资源POST请求返回405状态

来源:互联网 发布:ff14男性捏脸数据 编辑:程序博客网 时间:2024/05/29 16:40

http://my.oschina.net/lemonzone2010/blog/174505
同事给了一个json请求,在HTTP接口测试工具中post请求结果返回405状态,get请求则返回数据。搜了一番发现返回405是因为Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求。
试了网上的好几种方法,下面这个受用,通过upstream转换静态文件接收的POST请求到GET方式

    upstream static_resource {               server localhost:80;         }    server {        listen       80;        server_name app.test.com;        root   /home/app.test.com/;         location / {            root   /home/app.test.com/;            index  index.shtml index.html;        }        error_page 405 =200 @405;         location @405         {             root /home/app.test.com/;            proxy_method GET;             proxy_pass http://static_resource;          }   

再次在HTTP接口测试工具测试,发现405变成了404,想了一下,是因为web服务器上配置了多个虚拟主机监听在80端口,upstream默认访问的是一个配置文件中的第一个虚拟主机,而不是我要放行post请求的app.test.com,于是尝试在定义一个虚拟主机监听在81端口,指向app.test.com

server {        listen       81;        server_name app.test.com;        root   /home/app.test.com/;        location / {            root   /home/app.test.com/;                 }    }

同时修改upstream中server,再次请求返回状态由405变成200

 upstream static_resource {               server localhost:81;         }

下面备注下网传的方法,此方法我配置后无效

   error_page   405 =200 @405;   location @405   {       root  /home/app.test.com;   }    

此方法配置后返回状态由405变成302

  location / {            root   /home/phone_app/;            error_page 405 =200 http://$host$request_uri;            index  index.shtml index.html;        }

此方法未尝试
修改nginx源码目录下src/http/modules/ngx_http_static_module.c,将以下代码注释,按照原来的编译参数,重新编译安装nginx

/*    if (r->method & NGX_HTTP_POST) {        return NGX_HTTP_NOT_ALLOWED;       }*/

或者按照原来的编译参数 ./configuer make 不执行make install

cp  $nginx_dir/sbin/nginx  $nginx_dir/sbin/nginx.bakcp ./objs/nginx   $nginx_dir/sbin/nginx$nginx_dir/sbin/nginx -s reload
0 1