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命令重新加載配置。然後再次上傳試試。