1. 程式人生 > >nginx的rewrite指令

nginx的rewrite指令

服務 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指令