如何configurationnginx使用URL的一部分作为头?

我正在尝试运行一个支持多个客户的服务器应用程序。

他们都应该使用自己的URL访问应用程序,例如http://localhost:8082/customer1/config ,但应用程序需要将客户特定部分作为请求标头。 该请求应该被redirecthttp://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; } } 

我怎样才能configurationnginx,所以它需要任何客户名称,并将其放入标题?

这可能是一个正则expression式,有一个捕获组,结合mod_headers,你将不得不编译成Nginx 。

如果规则起作用,它可能看起来像这样 – 请注意,我没有努力写出正确的正则expression式,你必须这样做,而且它是完全未经testing的。 这只是简单地给你这个概念,所以你可以按照自己的想法来制定细节,或者排除一些细节。

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

如果有效,我build议发布你最终的位置是为了帮助未来可能有这种需求的其他人。

这是我做这个工作的方式:

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

感谢Tim的灵感。

请注意,这也会阻止select以vaadinServletcustomer开头的url。 如果您不需要特别处理这些关键字,那就足够了

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

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