Nginx

如何配置 nginx 以使用 URL 的一部分作為標頭?

  • May 27, 2016

我正在嘗試執行一個支持多個客戶的伺服器應用程序。

他們每個人都應該使用自己的 URL 訪問應用程序,例如http://localhost:8082/customer1/config,但應用程序需要將客戶特定部分作為請求標頭。該請求應重定向到http://localhost:9002/config.

如果我為每個客戶編寫一個位置規則,我可以實現這一點:

server {
   listen          8082;
   server_name     localhost;
   root            /;

   location /customer1/ {
           proxy_set_header X-Forwarded-Host $host;
           proxy_set_header X-Forwarded-Server $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $host;
           proxy_cookie_path ~*^/.* /;
           proxy_set_header X-customer customer1;
           proxy_pass http://127.0.0.1:9002/;
           proxy_redirect off;
   }
}

我如何配置 nginx 以便它獲取任何客戶名稱並將其放入標題中?

這是我如何完成這項工作的:

location ~ ^/(?!vaadinServlet|customer)(.+?)/(.*) {
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;
      proxy_cookie_path ~*^/.* /;
      proxy_set_header X-customer $1;
      proxy_pass http://127.0.0.1:9002/$2;
      proxy_redirect off;
}

感謝蒂姆的靈感。

請注意,這也可以防止選擇以vaadinServletcustomer不被選擇的 URL。如果您不需要對此類關鍵字進行特殊處理,則使用就足夠了

location ~ ^/(.+?)/(.*) {
   ...
}

如果要處理的 URL 部分不必出現在開頭(即在伺服器名稱之後),請刪除^.

這可以通過具有擷取組的正則表達式以及您必須編譯成 Nginx的 mod_headers 來實現。

如果規則有效,它可能看起來像這樣 - 請注意,我沒有努力編寫正確的正則表達式,你必須這樣做,而且它完全未經測試。這只是為了給您提供概念,以便您可以跟進並製定細節,或者排除它。

location ~ /(customer?)/config {
 add_header X-customer $1;
 proxy_pass http://localhost:9002/config;
 # proxy_pass related declarations
}

如果可行,我建議發布您的最終位置,以幫助將來可能有此需求的其他人。

引用自:https://serverfault.com/questions/778920