Skip to main content

如何用 Nginx 创建临时或永久重定向(Redirect)

作者:Mateusz Papiernik

导语

HTTP 重定向(redirection),指的是使一个域或地址指向另一个域或地址的方法。重定向有多种类型,每种对于客户端浏览器都意味着不同的涵义。而两种最常见的类型,是临时重定向(temporary redirect)和永久重定向(permanent redirector)。

如果您暂时需要从其它位置提供 URL,可以使用临时重定向(响应状态码 302 Found)。例如,当您正在维护站点时,您可能需要在域中使用临时重定向。这个临时重定向可以通往一个解释页面,用来告知访问者您很快就会回来。

另一方面,永久重定向则会使浏览器完全遗忘旧的地址,不再尝试访问它(响应状态码 301 Moved Permanently)。在您将内容永久移动到新位置后(例如更改域名),就可以使用永久重定向。

本指南将以一些特定情况为例,深入解释如何在 Nginx 中实现各种重定向。

前期准备

本教程需要您有:

  • 一个安装了 Nginx 的服务器,用于为您的网站提供服务

解决方法一览

在 Nginx 中,您可以使用内置的重写指令完成大多数重定向。在新 Nginx 安装中,这个指令默认可用,且可以用于创建临时或永久重定向。最简单的情况下,它至少需要两个参数:旧 URL 和新 URL。

在服务器配置中,您可以使用以下代码行实现临时重定向:

server {
. . .
server_name www.domain1.com;
rewrite ^/$ http://www.domain2.com redirect;
. . .
}

这个重定向指令会使浏览器将所有对 www.domain1.com 的访问请求定向到 www.domain2.com。 但这种方法只对单个页面有效,并不适用于整个站点。如果要重定向多个页面,您可以使用带有正则表达式的 rewrite 指令,这样就可以指定整个目录,而不是单个文件。

redirect 会匹配括号中的正则表达式模式,然后使用 $1 表达式(1 代表第一组匹配的文本),引用在重定向目标中匹配到的文本。而在更复杂的例子中,后续匹配到的组会按顺序进行编号。

例如,如果您想暂时将 www.domain1.com 中的每个页面重定向至 www.domain2.com,您可以使用以下指令:

server {
. . .
server_name www.domain1.com;
rewrite ^/(.*)$ http://www.domain2.com/$1 redirect;
. . .
}

server {
. . .
server_name www.domain2.com;
. . .
}

默认情况下,rewrite 命令建立的是临时重定向。如果您想要创建一个永久重定向,您可以如下在指令结尾处用 permanent 代替 redirect

rewrite ^/$ http://www.domain2.com permanent;
rewrite ^/(.*)$ http://www.domain2.com/$1 permanent;

下面让我们来看看具体的例子。

例1:移至不同的域

如果您的网站已经搭建完成,且您想将域更改为新地址,最好不要直接放弃旧的域。如果您的内容消失了,但没有任何措施指引浏览器定位内容的新的位置,则指向您网站的书签,还有网上所有其它页面上指向您网站的链接,这些都会失效。如果更改了域,却不进行重定向,您的网站将会失去以前的访问者和旧链接的流量。

在下面的示例中,我们将配置一个重定向,将名为 domain1.com 的旧域重定向到名为 domain2.com 的新域。这一次我们使用永久重定向,因为旧域会被弃用,未来所有的流量都应流向新的域。

假设您已将网站配置为由名一个为 domain1.com 的域提供服务,且已经在 Nginx 进行了如下配置:

server {
. . .
server_name domain1.com;
. . .
}

同样,假设您使用 domain2.com 为您未来的网站提供服务。

server {
. . .
server_name domain2.com;
. . .
}

让我们修改 domain1.com 服务器模块的配置文件,添加一个导向 domain2.com 的永久重定向。

server {
. . .
server_name domain1.com;
rewrite ^/(.*)$ http://domain2.com/$1 permanent;
. . .
}

我们使用了之前提到过的 rewrite 指令进行重定向。^/(.*)$ 正则表达式将会匹配 URL 中 / 后的所有部分。例如,http://domain1.com/index.html 将会重定向至 http://domain2.com/index.html。在 rewrite 后添加 permanent,我们就能完成永久重定向。

注意:在修改完成后,记得用 nginx -t 测试您的配置,并重启 Nginx。

例2:使修改单个页面名不影响访问

有时,您可能会需要修改单个页面的名称,即使这些页面已经发布并获得了流量。如果单独修改页面名称,之前的访问者在用原有 URL 进行访问时就会收到 404 Not Found 错误。您可以使用重定向来避免这种情况。这样,添加了旧页面为书签,或是在搜索引擎上找到旧链接的人依然可以到达正确的页面。

假设您的网站有两个单独的页面,一个是产品页面,名为 products.html,一个是服务页面,名为 services.html。现在,假设您决定将这两个页面替换为一个单独的服务页面,名为 offers.html。我们将为 products.htmlservices.html 配置一个简单的重定向,让它们导向 offers.html

假设您的网站配置如下:

server {
. . .
server_name example.com www.example.com;
. . .
}

配置重定向十分简单,只需要用两个 redirect 指令。

server {
. . .
server_name example.com www.example.com;
rewrite ^/products.html$ /offer.html permanent;
rewrite ^/services.html$ /offer.html permanent;
. . .
}

rewrite 指令接受需要重定向的原地址,以及新页面的地址。既然例子中需要的修改不是暂时的,我们同样在指令中添加了 permanent。您可以按需使用多个重定向指令,以此确保访问者在切换网页内容时不会看到不必要的 404 Not Found 错误。

结语

现在,您已经了解了如何将访问请求定向至新位置。请务必按需正确使用重定向类型,因为临时重定向的不当使用会损害您的搜索排名。

HTTP 重定向还有许多别的用处,包括强制进行安全 SSL 链接(即使用 https 而不是 http),和确保所有访问者只能访问前缀为 www. 的地址。正确使用重定向使您既能利用当前的网络,又能根据需要修改站点结构。