以下内容适用于从应用程序代码中获取含义,我可以检测请求 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.com
customer_domain.com
mydomain.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 地址。