如何配置 nginx 以使用 URL 的一部分作为标头?

如何配置 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 以便它能获取任何客户名称并将其放入标头中?

答案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;
}

感谢蒂姆的启发。

请注意,这也会阻止选择以vaadinServletcustomer开头的 URL。如果您不需要对此类关键字进行特殊处理,则使用

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

如果要处理的 URL 部分不必出现在开头(即服务器名称之后),请删除^

相关内容