![如何配置 nginx 将所有请求从域别名重定向到主域?](https://linux22.com/image/600215/%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%20nginx%20%E5%B0%86%E6%89%80%E6%9C%89%E8%AF%B7%E6%B1%82%E4%BB%8E%E5%9F%9F%E5%88%AB%E5%90%8D%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E4%B8%BB%E5%9F%9F%EF%BC%9F.png)
我确实有一个响应多个域的 nginx 服务器,并且我确实想将所有请求重定向到主域。
例如:网站对和xxx xxx.example.com yyy.example.com $hostname
均作出响应。http
https
我想以这样的方式配置服务器,以便所有对其他域名的请求都将被重定向到xxx.example.com
。
答案1
我认为应该采取以下措施:
set $primary_domain "xxx.example.com";
if ($host != $primary_domain) {
rewrite ^ $scheme://$primary_domain permanent;
}
答案2
最有效和干净的方法是配置两个单独的服务器{}块 - 一个用于执行重定向,另一个(具有规范名称)用于实际处理请求。
示例配置:
server {
listen 80;
listen 443 ssl;
server_name xxx yyy.example.com $hostname;
ssl_certificate ...
ssl_certificate_key ...
return 302 $scheme://xxx.example.com$request_uri;
}
server {
listen 80;
listen 443 ssl;
server_name xxx.example.com;
ssl_certificate ...
ssl_certificate_key ...
...
}
文档:
答案3
这是 Brenton Alker 的答案的一个变体,使用$server_name
多变的重用该server_name
指令的值。
server_name primary.tld secondary.tld;
if ($host != $server_name) {
rewrite ^ $scheme://$server_name permanent;
}
或者,保留任何查询参数:
server_name primary.tld secondary.tld;
if ($host != $server_name) {
rewrite ^/(.*) $scheme://$server_name/$1 permanent;
}
这里,$server_name
指的是主服务器名称,这是指令中的第一个名称server_name
,而$host
指的是 HTTP 请求中给出的主机名。
请注意,if
nginx 配置中的语句并不总是能达到您的预期,有些人不鼓励使用它。另请参阅https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/