nginx代理去掉URL前綴的實(shí)現(xiàn)方法
今天接到一個(gè)配置nginx的需求是:需要訪問(wèn)某個(gè)域名時(shí),nginx可以去掉前綴去代理訪問(wèn)到后端
正常配置情況下:
在nginx配置文件中中設(shè)置了 location /prod-api/api 時(shí) 瀏覽器訪問(wèn) /prod-api/api 反向代理到后端服務(wù)后,后端服務(wù)接收到的url地址實(shí)際還是 /prod-api/api
需要實(shí)現(xiàn)的功能需求:
訪問(wèn)url路徑/prod-api/api經(jīng)過(guò)nginx反向代理后,到達(dá)后端服務(wù)的實(shí)際url地址為/api。
以下是原nginx配置文件中l(wèi)ocation部分的配置內(nèi)容:
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root /usr/share/nginx/html/cashier;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/ {
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;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:9076;
}
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
}將上述代碼修改為如下nginx location代碼:
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root /usr/share/nginx/html/cashier;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location ^~/prod-api/ {
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;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:9076/;
}
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
}注意點(diǎn):
- 在proxy_pass 反向代理地址最后加一個(gè)/
- 在location匹配的url路徑前添加^~/
location ^~/prod-api/:匹配任何以 /prod-api/ 開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條
- 不可以使用:
proxy_set_header Host $http_host;
我在現(xiàn)有環(huán)境的nginx里添加這段配置之后,訪問(wèn)會(huì)轉(zhuǎn)不過(guò)去,查看nginx日志也只能看到是404信息,并沒(méi)有更多定位問(wèn)題的信息。檢查了許久也沒(méi)找到原因,于是注釋掉location 里面所有配置,里面只加proxy_pass這段配置,結(jié)果nginx是能夠轉(zhuǎn)發(fā)成功的,這說(shuō)明單獨(dú)來(lái)看這條location的配置是沒(méi)有問(wèn)題的,很有可能是現(xiàn)有環(huán)境nginx里的某些配置影響到了這個(gè)轉(zhuǎn)發(fā)。
為了定位問(wèn)題原因,location下的配置逐個(gè)注釋來(lái)定位問(wèn)題,最后發(fā)現(xiàn)當(dāng)注釋掉proxy_set_header Host $http_host ;這條配置之后,就能成功轉(zhuǎn)發(fā)了。這才注意到是反向代理配置的問(wèn)題。
此配置的作用是:把原h(huán)ttp請(qǐng)求的Header中的Host字段也放到轉(zhuǎn)發(fā)的請(qǐng)求里。
如果不加這一行的話,nginx轉(zhuǎn)發(fā)的請(qǐng)求header里就不會(huì)有Host字段,而服務(wù)器是靠這個(gè)Host值來(lái)區(qū)分你請(qǐng)求的是哪個(gè)域名的資源的。
但是現(xiàn)有環(huán)境中原有的配置也不能隨便刪掉,所以可以進(jìn)行如下設(shè)置:
即,在location里面添加一條 proxy_set_header Host $proxy_host;配置。
設(shè)置 proxy_set_header Host $host 時(shí),瀏覽器直接訪問(wèn) nginx,獲取到的 Host 是 $host 的值,沒(méi)有端口信息。此時(shí)代碼中如果有重定向路由,那么重定向時(shí)就會(huì)丟失端口信息,導(dǎo)致 404
補(bǔ)充知識(shí):Nginx 轉(zhuǎn)發(fā)時(shí)去掉前綴保留傳參
最終效果
Nginx 將
127.0.0.1:8082/proxy/switchSystemRole?roleId=29
轉(zhuǎn)發(fā)至
127.0.0.1:9301/switchSystemRole?roleId=29
server {
listen 8082;
server_name 127.0.0.1;
location /proxy/ {
proxy_pass http://127.0.0.1:9301/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}總結(jié)
到此這篇關(guān)于nginx代理去掉URL前綴的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)nginx代理去掉URL前綴內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用nginx打包部署前端vue項(xiàng)目完整過(guò)程(保姆級(jí)教程)
這篇文章主要給大家介紹了關(guān)于使用nginx打包部署前端vue項(xiàng)目的相關(guān)資料,包括打包命名、執(zhí)行打包命令、檢查打包成功、下載和解壓Nginx、部署到Nginx、啟動(dòng)Nginx并訪問(wèn)項(xiàng)目、以及Nginx的優(yōu)勢(shì),需要的朋友可以參考下2024-11-11
nginx部署vue項(xiàng)目的詳細(xì)圖文教程
很多小伙伴在做完Vue項(xiàng)目之后,想要部署到服務(wù)器上自己運(yùn)行試試,下面這篇文章主要給大家介紹了關(guān)于nginx部署vue項(xiàng)目的詳細(xì)圖文教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
nginx里的rewrite跳轉(zhuǎn)的實(shí)現(xiàn)
這篇文章主要介紹了nginx里的rewrite跳轉(zhuǎn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
修改配置解決Nginx服務(wù)器中常見的上傳與連接錯(cuò)誤
這篇文章主要介紹了修改配置解決Nginx服務(wù)器中常見的上傳與連接錯(cuò)誤的方法,分別針對(duì)Nginx的413錯(cuò)誤與111錯(cuò)誤,需要的朋友可以參考下2016-01-01
Nginx PHP-Fcgi中因PHP執(zhí)行時(shí)間導(dǎo)致504 Gateway Timeout錯(cuò)誤解決記錄
這篇文章主要介紹了Nginx PHP-Fcgi中因PHP執(zhí)行時(shí)間導(dǎo)致504 Gateway Timeout錯(cuò)誤解決記錄,本文的解決方法得來(lái)不易,需要的朋友可以參考下2014-09-09

