我需要根据http请求的来源路由流量。我有两个环境,我们需要使用“ $ http_referer”将对“ / us-en”的每个http请求重定向到Environment1,将其他请求重定向到Environment2。
location ~ /us-en {
proxy_pass Environment1;
proxy_set_header Host Environment1;
}
if ($http_referer ~ ^https?://dev.xyz.com/us-en){
rewrite ^/us-en(/*)$ HOME_PAGE$1 break;
proxy_pass Environment1;
}
Error: nginx: [emerg] "proxy_pass" directive is not allowed here in /opt/nginx/conf/nginx.conf.
注意:默认情况下,由于存在上游配置,所有流量都流向Environment2。
答案 0 :(得分:1)
# needed if your proxy destination specified with domain name instead of IP address
resolver 8.8.8.8;
location /home/ {
proxy_set_header Host HOST1;
# setup other proxied headers if needed
if ($http_referer ~ ^https?://dev.xyz.com/home) {
rewrite ^/home(/.*)$ HOME_PAGE$1 break;
proxy_pass https://HOST1:8080; # this can be specified by IP address
}
}
通过这样的配置,从your_domain.com/home/path/file
向dev.xyz.com/home/...
(而不是从dev.xyz.com/any/other/path
发出的请求)将被代理到https://HOST1:8080/HOME_PAGE/path/file
。如果您使用域名而不是IP地址指定代理目标,则需要在服务器配置中指定其他参数resolver
。您可以使用本地名称服务器,也可以使用外部名称服务器,例如Google公共DNS(8.8.8.8)或ISP为您提供的DNS。无论如何,这样的配置会导致其他DNS查找,因此,如果可以的话,请使用IP地址指定代理目标。
更新
还有另一种使用valid_referers
指令的方法:
# needed if your proxy destination specified with domain name instead of IP address
resolver 8.8.8.8;
location /home/ {
proxy_set_header Host HOST1;
# setup other proxied headers if needed
valid_referers example.com/home;
if ($invalid_referer = "") {
rewrite ^/home(/.*)$ HOME_PAGE$1 break;
proxy_pass https://HOST1:8080; # this can be specified by IP address
}
}