nginx的rewrite指令
阿新 • • 發佈:2018-10-06
服務 http add 最長 rewrite 指令 con 目的 優先
需求:我們在接收到一個/api/upload 開頭的url的時候 要轉發到另外一個地址。但是又不想追加/api/upload 只想追加/upload 地址。
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
命令重新加載配置。然後再次上傳試試。
nginx的rewrite指令