在最近对接统一支付平台的过程中,相信很多产品,包括云空间都遇到了支付成功后回调支付成功页时,报405 method not allowed的情况。这是因为支付成功后,回调的请求方式是post,而大多数产品的支付成功页是一个静态页面,要知道Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求。
以nginx为例,当post请求静态页面时,会直接报405
curl -X POST http://127.0.0.1:8081/test.html
<html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/0.5.35</center>
</body>
</html>
打开nginx底层的配置文件,我们可以看到这么一段,
if (r->method & NGX_HTTP_POST) {
return NGX_HTTP_NOT_ALLOWED;
}
rc = ngx_http_discard_request_body(r);
if (rc != NGX_OK) {
return rc;
}
可知nginx在初始化编译的时候,就默认配置了静态页面的post不支持,若要解决该问题,则有如下几种解决方案:
1、将上述配置中找到的
if (r->method & NGX_HTTP_POST) {
return NGX_HTTP_NOT_ALLOWED;
}
注释掉。。。。
重新编译即可 做到这说明了nginx可以支持静态文件的post的请求了
2、在绝大多数的情况下,还是建议使用get请求来打开静态页面,包括所有产品此前对接boss支付的时候,回调都是以get发起的请求。然而,统一支付由于还有对接别的外部系统的需求,回调请求不得不配置成post。
3、修改nginx.conf配置文件,配置忽视405错误,直接改为200正常响应:
error_page 405 =200 $uri;
或
error_page 405 =200 @405;
location @405 {
proxy_method GET;
proxy_pass http://localhost:8080;
}
proxy_pass可配置其他地址