nginx 前端POST請求405問題解決與排查過程


問題描述

在請求時,f12提示POST請求報錯405

環境描述

nginx轉發至后端nginx,后端nginx轉發至后端golang api接口

解決步驟

根據網上方法排查,發現80%以上無非就是以下幾個解決方法

 

方法一:將所有POST 405錯誤發送到命名位置@app 資料地址:https://distinctplace.com/2017/04/17/405-not-allowed-nginx-fix-post-requests/

server {
  listen 80;
  root /my/root;
  error_page 405 = $uri;
  # magic happens here
  rewrite ^.*$ /api.json last;
  location / {
     index index.html;
  }
}

方法2:error_page 405 =200 $uri;

server {
     listen       80
     server_name  localhost;
     location / {
         root   html;
         index  index.html index.htm;
     }
     error_page  404     /404.html;
     error_page  403     /403.html;
     # To allow POST on static pages 允許靜態頁使用POST方法
     error_page  405     =200 $uri;
}

還有的網站上寫明說需要重新編譯nginx,如:https://gist.github.com/zxhfighter/7560812

 

此種方式經過嘗試后,發現問題,查詢資料后說明error_page 405 =200 $uri;是將POST請求轉換GET。https://stackoverflow.com/questions/24415376/post-request-not-allowed-405-not-allowed-nginx-even-with-headers-included

而使用此方法會出現返回不一致的問題,如這里應返回json文本,此處卻是 html的文本,其原因就是因為請求的方式不一致,因返回格式不一致,導致前端報錯。

   

此時嘗試其他方法進行解決,將nginx轉發配置更改為如下配置

location / {
    proxy_pass http://log.xxxx.xxxx.com:81/;
    proxy_set_header Host $host;
    client_max_body_size 10m;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

之前的配置如下

location /xxx/ {
    proxy_pass http://log.xxxx.xxxx.com:81/;
}

 這時出現502問題,查看后端nginx發現並無前端的請求,並且后端服務沒有問題。使用proxy_pass 中填寫的地址用postman模擬是可以正常訪問。

經過排查發現,問題的原因是在於 nginx中傳遞了host,而后端也是nginx反向代理,而此nginx中並無原始請求的host,故報502錯誤。

proxy_set_header Host $host; 

 刪除Host的設置,成功返回200,但是有一個問題為,並無返回值。

檢查nginx配置,發現nginx代理時使用這種方式時沒有傳遞請求參數的,故沒有返回值。 備注:nginx如何轉發參數,參考的此篇文章https://codeday.me/bug/20170920/74504.html

location / {
    proxy_pass http://log.xxxx.xxxx.com:81/;
    proxy_set_header Host $host;
    client_max_body_size 10m;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

修改后配置

location ~* ^/xxxxx/(.*)$ {
    proxy_pass http://logs.xxx.xxxxx.com:81/$1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

 

修改完成后,再次訪問,發現請求變成GET,查詢nginx官網文檔,http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method。文檔中提到,此時的請求不是客戶端的請求,而是反向代理客戶端的請求,可以用proxy_method POST;設置請求方式為POST。

最終配置文件如下

location ~* ^/xxxxx/(.*)$ {
    proxy_pass http://logs.xxxx.xxxxxxxxxx:81/$1;
    proxy_method POST;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

 

此時,請求正常了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM