nginx代理轉(zhuǎn)發(fā)報(bào)錯(cuò)405?Method?Not?Allowed解決
背景
在使用nginx做代理web容器轉(zhuǎn)發(fā)的時(shí)候,根據(jù)url的前綴轉(zhuǎn)發(fā)到不同的服務(wù),出現(xiàn)了接口報(bào)405的錯(cuò)誤,網(wǎng)上查了好多文檔,說了好多種原因,經(jīng)過排查定位,最終定位到的原因是請求的url地址不對,多了一個(gè)轉(zhuǎn)發(fā)的前綴。
解決
由于定位到了原因是請求的時(shí)候多了一個(gè)web容器/assetslog的上下文地址,如下圖

所以如果可以在轉(zhuǎn)發(fā)的時(shí)候,將這個(gè)前綴去掉,就可以正常訪問,比如:
a.com/user/user.html轉(zhuǎn)發(fā)到用戶服務(wù)b.com/user.html
a.com/order/order.html轉(zhuǎn)發(fā)到訂單服務(wù)b.com/order.html
即,url的前綴對下游的服務(wù)是不需要的,除非下游服務(wù)添加context-path, 但很多時(shí)候我們并不喜歡加這個(gè)。如果Nginx轉(zhuǎn)發(fā)的時(shí)候,把這個(gè)前綴去掉就好了。
方法1:proxy_pass后面加根路徑/
server {
listen 80;
server_name a.com;
location ^~/user/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://user/;
}
location ^~/order/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://order/;
}
}^~/user/表示匹配前綴是user的請求,proxy_pass的結(jié)尾有/, 則會把/user/*后面的路徑直接拼接到后面,即移除location上的規(guī)則 user和order
方法2:使用rewrite,注意到proxy_pass結(jié)尾沒有/, rewrite重寫了url
server {
listen 80;
server_name a.com;
location ^~/user/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
rewrite ^/user/(.*)$ /$1 break;
proxy_pass http://user;
}
location ^~/order/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
rewrite ^/order/(.*)$ /$1 break;
proxy_pass http://order;
}
}此外nginx還可以簡單的直接把請求原封不動(dòng)的轉(zhuǎn)發(fā)給下一個(gè)服務(wù)
比如,訪問a.com/app/a/b.html, 要求轉(zhuǎn)發(fā)到b.com/app/a/b.html
設(shè)置proxy_pass即可。請求只會替換域名
server {
listen 80;
server_name a.com;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://b.com;
}
}以上就是解決nginx代理轉(zhuǎn)發(fā)報(bào)錯(cuò)405 Method Not Allowed的詳細(xì)內(nèi)容,更多關(guān)于解決nginx代理轉(zhuǎn)發(fā)報(bào)錯(cuò)405 Method Not Allowed的資料請關(guān)注腳本之家其它相關(guān)文章!
- Nginx配置四層、七層網(wǎng)絡(luò)代理轉(zhuǎn)發(fā)的方法示例
- nginx配置proxy_pass代理轉(zhuǎn)發(fā)時(shí)報(bào)404問題
- Nginx常用配置以及代理轉(zhuǎn)發(fā)操作詳解
- Nginx反向代理轉(zhuǎn)發(fā)tomcat的實(shí)現(xiàn)
- 通過Nginx代理轉(zhuǎn)發(fā)配置實(shí)現(xiàn)跨域的方法(API代理轉(zhuǎn)發(fā))
- Nginx 代理轉(zhuǎn)發(fā)阿里云OSS上傳的實(shí)現(xiàn)代碼
- 詳解Nginx 利用代理轉(zhuǎn)發(fā)請求示例
- nginx代理轉(zhuǎn)發(fā)配置小結(jié)
相關(guān)文章
Nginx利用Lua+Redis實(shí)現(xiàn)動(dòng)態(tài)封禁IP的方法
在站點(diǎn)遇到攻擊且無明顯攻擊特征,造成站點(diǎn)訪問慢,nginx不斷返回502等錯(cuò)誤時(shí),可利用nginx+lua+redis對該IP進(jìn)行封禁,這篇文章主要給大家介紹了關(guān)于Nginx利用Lua+Redis實(shí)現(xiàn)動(dòng)態(tài)封禁IP的相關(guān)資料,需要的朋友可以參考下2018-12-12
Debian下搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡的方案
這篇文章主要介紹了Debian下搭建Nginx和Tomcat服務(wù)器實(shí)現(xiàn)負(fù)載均衡的方案,其主要思想依然是動(dòng)靜分離并且以Nginx來進(jìn)行反向代理這樣的路子,需要的朋友可以參考下2015-12-12
Nginx服務(wù)器配置https安全協(xié)議的實(shí)現(xiàn)
HTTP是互聯(lián)網(wǎng)中最常用的協(xié)議,用于從服務(wù)器傳輸超文本到瀏覽器,HTTPS是HTTP的安全版本,本文就來介紹一下Nginx服務(wù)器配置https安全協(xié)議的實(shí)現(xiàn),感興趣的可以了解一下2024-09-09

