为子域配置反向代理,但保留链接的域名

为子域配置反向代理,但保留链接的域名

我有一个网站(使用 ruby​​ on rails + angularJS 开发并在 nginx + unicorn 上运行),用户可以通过不同的 URI 访问几个页面。例如,www.example.com/1234 和 1234.example.com 加载相同的内容。

问题是 1234.example.com 中的链接无法正常工作,因为这些链接依赖于主机,而 1234.example.com 不是有效的主机。

我的子域名的 nginx 配置如下:

server {
    root /var/www/example.com/current/public;
    server_name 1234.example.com;

    try_files $uri/index.html $uri.html $uri @app;

    location / {
        add_header Set-Cookie qid=1234;
        proxy_pass https://www.example.com/1234;
        proxy_set_header X-Forwarded-For;
        proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        proxy_redirect off;
    }

    location /assets/ {
        alias /var/www/example.com/current/public/assets/;
        proxy_pass https://www.example.com;
    }

    location ~ /(library|categories) {
       proxy_pass https://www.example.com;
    }
}

加载所有内容都需要 Cookie 和位置指令“/assets/”和“~ /(library|categories)”。

因此,我只需要针对“/”位置将主机设置为 1234.example.com,但在其他任何情况下,主机都应该是 www.example.com。

太感谢了。

答案1

Nginx 的一个方法是使用映射:

map $http_host $sitevar {
   1234.example.com "1234";
   default "";
}

if ($sitevar = 1234) {
   rewrite ^ /1234 permanent;
}

并将你的 cookie 设置qid=$sitevar

然后将 server_name 设置为通配符:

server_name .example.com;

就此而言,您可以这样做并在代码中处理路由,因为您可以将变量作为请求的一部分传递。

相关内容