如何使用Nginx将网址重定向到另一个域名?

211

如何使用Nginx将mydomain.example及其任何子域名*.mydomain.example重定向到www.adifferentdomain.example

8个回答

376

server_name通过.mydomain.example语法支持后缀匹配:

server {
  server_name .mydomain.example;
  rewrite ^ http://www.adifferentdomain.example$request_uri? permanent;
}

或在任何 0.9.1 或更高版本上:

server {
  server_name .mydomain.example;
  return 301 http://www.adifferentdomain.example$request_uri;
}

1
@Ryan 当未指定端口时,listen指令默认为80端口。一般情况下,实际情况比这更加复杂;有关更多详细信息,请参阅nginx配置文档 - Yitz
3
问号(?)在句末的作用是什么? - Dan Dascalescu
7
rewritereturn 301 $scheme://www.adifferentdomain.com$request_uri;之间的区别是什么? - Dan Dascalescu
7
在重写规则的末尾添加问号告诉Nginx不要附加原始的查询字符串。由于$request_uri已经包含了查询字符串,所以不需要再次附加它。return 301语法较新,并且两种方法之间行为上没有区别,但在我最初回答这个问题时,许多发行版没有必需版本,因此我选择了更安全的语法。 - kolbyjack
1
对于那些不希望重定向是永久的人,应该使用“302”代码。 “301”重定向意味着页面已永久移动到新位置,而“302”重定向意味着移动只是暂时的。 - Majid
显示剩余9条评论

34

20

如果可以使用return,为什么要使用重写模块?严格来说,return是重写模块的一部分,你可以在这里阅读相关信息,但是我认为这个片段更容易阅读。

server {
    server_name  .domain.com;

    return 302 $scheme://forwarded-domain.com;
}

你还可以给它进行301重定向。


1
这是否也会保留路径和查询参数? - mpen
4
不,@Mark,这个例子并没有做那件事。但我想你可以混合之前的答案,得出这样的结果:return 302 $scheme://forwarded-domain.com$request_uri; - Robin van Baalen
顺便提一下,在许多情况下,您应该只是重定向到https,而不是保留方案(即使用https而不是$scheme)。这是因为协议相对链接现在已被认为是过时的 - http://www.paulirish.com/2010/the-protocol-relative-url/。 - mahemoff
@mahemoff 这并不完全正确。考虑将Web服务器放在负载均衡器后面,该负载均衡器正在卸载SSL的情况。 - Sebastian Neira

20

我在我的网站上使用这段代码

server {
        listen 80;
        listen 443;
        server_name  .domain.example;

        return 301 $scheme://newdomain.example$request_uri;
}

1
到目前为止,这是最准确的答案。$scheme 可能有点值得商榷,但另一方面它涵盖了本地开发/私有网络的情况。 - Kirill Titov
1
这是最好的答案! - Hese

13

你可以通过HTTPRewriteModule实现该功能。

www.example.com 重写为 example.com 的示例:

server {
    server_name www.example.com;
    rewrite ^ http://example.com$request_uri? permanent;
}

我不确定,但我认为以下代码可以实现:server_name mydomain.com; rewrite www.adifferentdomain.com permanent; }这样做应该可以将所有 *.mydomain.com 的内容重定向到 www.adifferentdomain.com。 - udo
@deb 你只需要写成 server_name example.com www.example.com; - citruspi
该问题特别要求任何子域名重定向到不同的域。这个答案没有回答这两个问题(明确地)。 - Kissaki
这里缺少重要的301! - Sliq

10

如果你想要将对domain1.example的请求重定向到domain2.example,你可以创建一个像这样的服务器块:

server {
    listen 80;
    server_name domain1.example;
    return 301 $scheme://domain2.example$request_uri;
}

有些人可能需要重定向 https 请求。 listen 443; - Rafik Farhad
1
@RafikFarhad 'listen 443 ssl;'监听443端口,启用SSL加密。 - pbies

6
您可以在 server {} 块内部编写一个 if 条件语句:
server {

    if ($host = mydomain.example) {
        return 301 http://www.adifferentdomain.example;
    }
}

在Nginx中使用“if”语句时需要小心(https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/)。在这种情况下,您可以直接使用“server_name mydomain.com”。 - Marty
如果在位置上下文中使用,<code><script></code>是有害的,但在指定重定向主机时使用是安全的。 - cryptoKTM

4

临时重定向

rewrite ^ http://www.RedirectToThisDomain.example$request_uri? redirect;

永久重定向

rewrite ^ http://www.RedirectToThisDomain.example$request_uri? permanent;

在特定站点的Nginx配置文件中:
server {
    server_name www.example.com;
    rewrite ^ http://www.RedictToThisDomain.example$request_uri? redirect;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接