Nginx
如何配置 nginx 以使用 URL 的一部分作為標頭?
我正在嘗試執行一個支持多個客戶的伺服器應用程序。
他們每個人都應該使用自己的 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; }
感謝蒂姆的靈感。
請注意,這也可以防止選擇以
vaadinServlet
或customer
不被選擇的 URL。如果您不需要對此類關鍵字進行特殊處理,則使用就足夠了location ~ ^/(.+?)/(.*) { ... }
如果要處理的 URL 部分不必出現在開頭(即在伺服器名稱之後),請刪除
^
.
這可以通過具有擷取組的正則表達式以及您必須編譯成 Nginx的 mod_headers 來實現。
如果規則有效,它可能看起來像這樣 - 請注意,我沒有努力編寫正確的正則表達式,你必須這樣做,而且它完全未經測試。這只是為了給您提供概念,以便您可以跟進並製定細節,或者排除它。
location ~ /(customer?)/config { add_header X-customer $1; proxy_pass http://localhost:9002/config; # proxy_pass related declarations }
如果可行,我建議發布您的最終位置,以幫助將來可能有此需求的其他人。