更改主机传递给后端

时间:2015-03-12 01:48:34

标签: regex nginx hostname

我的前端服务器正在运行nginx。后端位于同一VPN上的另一台计算机上。这是它的配置:

server {
    listen   80;
    server_name *.vpn.domain.com;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://10.8.25.102:8100/;
        proxy_redirect http://10.8.25.102:8100/ http://$server_name/;
    }   
}

我想将不同的主机传递给后端...我希望后端接收,以便向subdomain.vpn.domain.com主机subdomain.local.domain.com发出请求

有没有办法做到这一点?我正在寻找一个正则表达式替换(甚至是子串替换),但我的成功却令人惊讶......我认为这将是一块蛋糕。我认为解决方案将在

server {
    listen   80;
    server_name *.vpn.domain.com;

    set $my_host $http_host;
    replace $my_host .vpn. .local.

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $my_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://10.8.25.102:8100/;
        proxy_redirect http://10.8.25.102:8100/ http://$server_name/;
    }   
}

只是因为我还没有找到replace $my_host .vpn. .local.的正确语法,我并不真正关心多次替换...我没有{{} 1}}

1 个答案:

答案 0 :(得分:0)

我终于明白了,我可以做到

if ($http_host ~ ^(.*)\.vpn\.(.*)$) {
    set $my_host $1.local.$2;
}

然后,随着CSRF验证的到位,我还需要重写Referer ...所以这就是它最终看起来的方式

server {
    listen   80;
    server_name *.vpn.domain.com;

    set $my_host $http_host;
    if ($http_host ~ ^(.*)\.vpn\.(.*)$) {
        set $my_host $1.local.$2;
    }

    set $referer $http_referer;
    set $referer_host no;
    if ($http_referer ~ ^(https?://)([^/]+)(/.*)$) {
        set $referer_host $2;
        set $rewritten_referer $1$my_host$3;
    }
    if ($referer_host = $http_host) {
        set $referer $rewritten_referer;
    }

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $my_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header Referer $referer;
        proxy_set_header IS_SECURE no;
        proxy_pass http://10.8.25.102:8100/;
        proxy_redirect https://$my_host/ https://$http_host/;
        proxy_redirect http://$my_host/ http://$http_host/;
    }
}