項目中遇到nginx代理post請求nodejs服務。但是一直404.發現好像是nginx重定向的時候將post請求變成了get請求。上配置:
# 負載均衡服務器配置
upstream pdf_upstream{
server localhost:3000;
server localhost:3001;
}
#代理配置
location ^~ /post/{
proxy_pass http://post_upstream;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
上面的配置測試一直無法通過。網上的rewrite方法我試了一下,好像也不行(對rewrite不是很了解,照葫蘆畫瓢發現不行)。最后加上proxy_method POST;
這個配置,使用測試工具可以正常測試。但是這樣配置有2個問題:
- 如果服務器有get請求的同名url,可能導致get無法被代理.
- Nginx還是會繼續重定向。
問題1尚不知道怎么解決。只能不提供get同名接口。
問題2的出現,在使用過httpClient的時候,需要我們處理重定向問題:
private CloseableHttpResponse redirect(CloseableHttpClient httpClient, StringEntity entity, CloseableHttpResponse response, int statusCode) throws IOException {
HttpPost post;
if(statusCode == HttpStatus.SC_MOVED_TEMPORARILY || statusCode == HttpStatus.SC_MOVED_PERMANENTLY){
Header location = response.getFirstHeader("location");
String newUrl = location.getValue();
post = new HttpPost(newUrl);
post.setEntity(entity);
response = httpClient.execute(post);
}
return response;
}
問題已解決!
為了解決nginx 總是post重定向get請求,打開nginx的說明文檔 https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/,按照上面操作一步一步實現下去,發現post請求可以正常請求。
upstream backend {
server localhost:8080;
server localhost:3001;
}
server {
location /post{
proxy_pass http://backend;
}
location / {
proxy_pass http://backend;
}
}
比對上面的配置和之前的配置,發現只有匹配的表達式不同。結果問題真的出現在這里!!
*做匹配路由的時候,最后不要跟 / *!