基于引用的Nginx条件路由

时间:2018-12-11 06:57:58

标签: nginx nginx-reverse-proxy nginx-config

我需要根据http请求的来源路由流量。我有两个环境,我们需要使用“ $ http_referer”将对“ / us-en”的每个http请求重定向到Environment1,将其他请求重定向到Environment2。

  1. 基于位置的重定向。
location ~ /us-en { 
    proxy_pass Environment1; 
    proxy_set_header Host Environment1; 
} 
  1. 使用'$ http_referer',以下选项不起作用。要求您的建议不变。
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。

1 个答案:

答案 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/filedev.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
        }
    }