我正在尝试运行一个支持多个客户的服务器应用程序。
他们都应该使用自己的URL访问应用程序,例如http://localhost:8082/customer1/config ,但应用程序需要将客户特定部分作为请求标头。 该请求应该被redirect到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; } }
我怎样才能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以vaadinServlet或customer开头的url。 如果您不需要特别处理这些关键字,那就足够了
location ~ ^/(.+?)/(.*) { ... }
如果要处理的URL部分不必在开始时出现(即服务器名称后面),请删除^ 。