介绍
HTTP 重定向 是将一个域或地址指向另一个的方式。 有几种不同类型的重定向,每一种对客户端浏览器都有不同的含义。 两种最常见的类型是临时重定向和永久重定向。
临时重定向(响应状态代码302 Found)在临时需要从不同位置提供URL时很有用。 例如,如果您正在执行站点维护,您可能希望使用从您的域到解释页面的临时重定向来通知您的访问者您将很快回来。
另一方面,永久重定向(响应状态代码301已永久移动)通知浏览器它应该完全忘记旧地址并且不再尝试访问它。 当您的内容被永久移动到新位置时(例如更改域名时),这些功能非常有用。
您可以通过在服务器配置文件中的服务器块条目中添加这样的行来在 Nginx 中创建临时重定向:
rewrite ^/oldlocation$ http://www.newdomain.com/newlocation redirect;
同样,使用这样的行进行永久重定向:
rewrite ^/oldlocation$ http://www.newdomain.com/newlocation permanent;
本指南将更深入地解释如何在 Nginx 中实现每种重定向,并通过一些特定用例的示例。
先决条件
要遵循本教程,您将需要:
- 一台安装并设置了 Nginx 的服务器,以使用服务器块为您的网站提供服务。 您可以按照如何在 Ubuntu 16.04、Debian 或 CentOS 上设置 Nginx 服务器块(虚拟主机)进行操作。
解决方案一览
在 Nginx 中,您可以使用内置的 rewrite
指令完成大多数重定向。 该指令在全新 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
指令建立一个临时重定向。 如果您想创建永久重定向,可以通过在指令末尾将 redirect
替换为 permanent
来实现,如下所示:
永久重定向
rewrite ^/$ http://www.domain2.com permanent; rewrite ^/(.*)$ http://www.domain2.com/$1 permanent;
让我们继续看一些具体的例子。
示例 1 - 移动到不同的域
如果您已经建立了网络形象并想将您的域更改为新地址,最好不要放弃您的旧域。 如果您的内容在没有任何关于如何找到其新位置的指示浏览器的情况下消失,则指向您网站的书签和位于整个 Internet 其他页面上的指向您网站的链接将会中断。 更改域而不重定向将导致您的网站失去以前访问者的流量。
在此示例中,我们将配置从名为 domain1.com
的旧域到名为 domain2.com
的新域的重定向。 我们将在这里使用永久重定向,因为旧域将被删除,从现在开始所有流量都应该转到新域。
假设您已将您的网站配置为从已在 Nginx 中配置的名为 domain1.com
的单个域提供服务,如下所示:
/etc/nginx/sites-available/domain1.com
server { . . . server_name domain1.com; . . . }
我们还将假设您已经在 domain2.com
上提供您未来版本的网站:
/etc/nginx/sites-available/domain2.com
server { . . . server_name domain2.com; . . . }
让我们更改 domain1.com
服务器块配置文件以添加永久重定向到 domain2.com
:
/etc/nginx/sites-available/domain1.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
。
注意: 配置更改后记得使用systemctl restart nginx
重启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
。 您可以使用尽可能多的重定向,以确保您的访问者在移动网站内容时不会看到不必要的未找到错误。
结论
您现在已经掌握了将请求重定向到新位置的知识。 请务必使用正确的重定向类型,因为临时重定向的不当使用会损害您的搜索排名。
HTTP 重定向还有多种其他用途,包括强制安全 SSL 连接(即 使用 https
而不是 http
) 并确保所有访问者最终只会访问网站的 www.
前缀地址。
正确使用重定向将允许您利用当前的网络存在,同时允许您根据需要修改站点结构。 如果您想了解更多关于重定向访问者的方法,Nginx 在官方文档的 重写模块 部分和 关于创建重定向的官方博客文章 [X243X ]。