我正在尝试运行一个支持多个客户的服务器应用程序。
他们应该各自使用自己的 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 以便它能获取任何客户名称并将其放入标头中?
答案1
这可能可以通过具有捕获组的正则表达式与 mod_headers 结合来实现,你必须编译成 Nginx。
如果规则有效,它看起来可能像这样 - 请注意,我没有花任何精力去编写正确的正则表达式,你必须自己写,而且它完全没有经过测试。这只是为了给你一个概念,这样你就可以跟进并找出细节,或者可能排除它。
location ~ /(customer?)/config {
add_header X-customer $1;
proxy_pass http://localhost:9002/config;
# proxy_pass related declarations
}
如果有效的话,我建议发布您的最终位置,以帮助将来可能有此需要的其他人。
答案2
以下是我完成这项工作的方法:
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 部分不必出现在开头(即服务器名称之后),请删除^
。