外部自定义域可从应用程序呈现,而无需更改浏览器地址栏中的 URI

外部自定义域可从应用程序呈现,而无需更改浏览器地址栏中的 URI

以下内容适用于从应用程序代码中获取含义,我可以检测请求 URI 并在浏览器地址栏中any_subdomain.mydomain.com相应地提供页面:any_subdomain.mydomain.com

server {
    listen 80;
    server_name ~^www\.(?<subdomain>.+\.)?mydomain\.com$;
    return 301 "$scheme://${subdomain}mydomain.com$request_uri";
}

现在我尝试了以下操作,希望在保留浏览器地址栏的同时customer_domain.com登陆,但实际上它会改变地址栏中的 URI,并且我的应用程序代码无法将其与 区分开来:mydomain.comcustomer_domain.commydomain.com

server {
    listen 80;
    server_name ~^(.+\.mydomain\.com)(?<domain>)?$;
    return 301 "$scheme://${domain}mydomain.com$request_uri";
}

以下块转发给应用程序。

server {
    listen  80 default_server;
    server_name ~^.+\.mydomain\.com$ mydomain.com;

    location / {
        # omitted. serve contents.
    }
}

在所有情况下,子域/域都使用 A 记录进行映射。CNAME 不是一种选择。您能帮我解决我在这里做错的事情吗?

答案1

return 301是 HTTP 重定向。HTTP 30x 重定向是发送到 Web 浏览器的响应,因此它们总是更改地址栏中显示的内容,因为这就是他们所做的。

例如,您的第一个 server{} 块火柴 www.(something).mydomain.com并重写 URL 以删除“www”前缀,从而只(something).mydomain.com显示在浏览器的地址栏中。

这就是第一个块所做的唯一一件事。 发生这种情况后,“真正的” webapp 请求不会由第一个块匹配 - 它们由最后一个块匹配。

因此,为了让 webapp 在“mydomain.com”以外的域上运行,请不要对任何内容使用 301 重定向;只需将它们添加到此行即可:

server_name ~^.+\.mydomain\.com$ mydomain.com;

使用 301 重定向仅有的如果您想实现“www”的删除,或者以其他方式更改地址栏中可见的URL。

示例配置

# strip 'www' from our own domain & subdomains
server {
    listen 80;
    server_name ~^www\.(?<subdomain>.+\.)?mydomain\.com$;
    return 301 "$scheme://${subdomain}mydomain.com$request_uri";
}

# strip 'www' from customer's domain & subdomains
server {
    listen 80;
    server_name ~^www\.(?<subdomain>.+\.)?customer\.com$;
    return 301 "$scheme://${subdomain}customer\.com$request_uri";
}

# serve the webapp for all domains that didn't match the above redirects
server {
    listen 80 default_server;
    server_name ~^.+\.mydomain\.com$ mydomain.com
                ~^.+\.customer\.com$ customer.com;

    location / {
        # omitted. serve contents.
    }
}

域名如何映射并不重要:Web 浏览器和 Web 服务器都不知道 A 和 CNAME 之间的区别,也不会改变其行为;无论如何,这两种域名最终都会解析为相同的 IP 地址。

相关内容