如何用 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.html
和 services.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.
的地址。正确使用重定向使您既能利用当前的网络,又能根据需要修改站点结构。