Nginx的rewrite指令修改訪問路徑
- 2019 年 11 月 1 日
- 筆記
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/weixin_44580977/article/details/99655747
原則上,為了不把除了網關以外的服務對外暴露的,保證安全。用修改nginx代理轉發到目標真實服務地址
既然不能修改頁面請求,那麼就只能在Nginx反向代理上做文章了。
我們修改nginx配置,將以/api/upload開頭的請求攔截下來,轉交到真實的服務地址:
location /api/upload { proxy_pass http://127.0.0.1:8082; proxy_connect_timeout 600; proxy_read_timeout 600; }
這樣寫大家覺得對不對呢?
顯然是不對的,因為ip和端口雖然對了,但是路徑沒變,依然是:http://127.0.0.1:8002/api/upload/image
前面多了一個/api
Nginx提供了rewrite指令,用於對地址進行重寫,語法規則:
rewrite "用來匹配路徑的正則" 重寫後的路徑 [指令];
我們的案例:
server { listen 80; server_name api.leyou.com; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 上傳路徑的映射 location /api/upload { proxy_pass http://127.0.0.1:8082; proxy_connect_timeout 600; proxy_read_timeout 600; rewrite "^/api/(.*)$" /$1 break; } location / { proxy_pass http://127.0.0.1:10010; proxy_connect_timeout 600; proxy_read_timeout 600; } }
- 首先,我們映射路徑是/api/upload,而下面一個映射路徑是 / ,根據最長路徑匹配原則,/api/upload優先級更高。也就是說,凡是以/api/upload開頭的路徑,都會被第一個配置處理
- proxy_pass:反向代理,這次我們代理到8082端口,也就是upload-service服務
- rewrite 「^/api/(.*)$」 /$1 break,路徑重寫:
- 「^/api/(.*)$」:匹配路徑的正則表達式,用了分組語法,把/api/以後的所有部分當做1組
- /$1:重寫的目標路徑,這裡用$1引用前面正則表達式匹配到的分組(組編號從1開始),即/api/後面的所有。這樣新的路徑就是除去/api/以外的所有,就達到了去除/api前綴的目的
- break:指令,常用的有2個,分別是:last、break
- last:重寫路徑結束後,將得到的路徑重新進行一次路徑匹配
- break:重寫路徑結束後,不再重新匹配路徑。 我們這裡不能選擇last,否則以新的路徑/upload/image來匹配,就不會被正確的匹配到8082端口了
修改完成,輸入nginx -s reload命令重新加載配置。然後再次上傳試試。