如何使用Nginx创建临时和永久重定向

介绍

HTTP重定向是一种将一个域或地址指向另一个的方法。有几种不同类型的重定向,每种类型对客户端浏览器意义不同。最常见的两种类型是临时重定向和永久重定向。

临时重定向(响应状态码302 Found)在需要临时从不同位置提供URL时很有用。例如,如果您正在进行网站维护,您可能希望从您的域到一个解释页面进行临时重定向,以通知您的访问者您将很快回来。

永久重定向(响应状态码301 Moved Permanently),另一方面,通知浏览器它应该完全忘记旧地址,不再尝试访问它。当您的内容已永久移动到新位置时,例如更改域名时,这些都很有用。

本指南将更深入地介绍如何在Nginx中实现每种类型的重定向,并针对特定用例进行一些示例。

先决条件

要按照本教程进行操作,您需要:

  • A server with Nginx installed and set up to serve your website(s). You can find some examples and instructions on the tutorials for Ubuntu 22.04, Debian, or CentOS.

一览解决方案

在 Nginx 中,您可以使用内置的 rewrite 指令完成大部分重定向操作。这个指令在全新的 Nginx 安装中默认可用,可以用来创建临时重定向和永久重定向。在其最简单的形式中,它至少需要两个参数:旧 URL 和新 URL。

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

Temporary redirect with rewrite
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,您可以使用以下方式:

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

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

默认情况下,rewrite 指令会建立一个临时重定向。如果你想创建一个永久重定向,你可以将指令末尾的 redirect 替换为 permanent,就像这样:

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

让我们继续看一些具体的例子。

示例 1 — 移动到不同的域名

如果你已经建立了网站,并想将域名更改为新地址,最好不要简单地放弃旧域名。如果你的内容没有任何关于如何找到其新位置的指示,那么你的网站收藏夹和其他网页中的链接将会失效。在没有重定向的情况下更改域名会导致你的网站失去来自之前访问者和旧链接的流量。

在这个例子中,我们将配置一个从旧域名 domain1.com 重定向到新域名 domain2.com 的重定向。我们会使用永久重定向,因为旧域名将被弃用,所有的流量都应该从现在开始指向新域名。

假设你已经将网站配置为从一个名为 domain1.com 的单一域名中提供服务,Nginx 中的配置如下:

/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

注意:在进行更改后,请使用 nginx -t 测试您的配置,然后重新启动 Nginx。

示例 2 —— 即使单个页面名称更改,也可以创建持久体验

有时,需要更改已发布并接收了站点流量的单个页面的名称。仅更改名称会导致访问原始 URL 的访问者收到 404 Not Found 错误,但您可以通过重定向来避免这种情况。这样可以确保已经将您的旧页面加为书签或通过搜索引擎上的过时链接找到它们的人仍然可以访问正确的页面。

假设您的网站为产品和服务分别设置了两个独立页面,分别为products.htmlservices.html。现在,您决定用一个名为offers.html的单一优惠页面替换这两个页面。我们将为products.htmlservices.html配置简单的重定向,使它们指向offers.html

我们假设您的网站配置如下:

Original server block configuration
server {
    . . .
    server_name example.com www.example.com;
    . . .
}

配置重定向就像使用两个重定向指令一样简单。

Redirects added to the original configuration
server {
    . . .
    server_name example.com www.example.com;
    
    rewrite ^/products.html$ /offer.html permanent;
    rewrite ^/services.html$ /offer.html permanent;
    . . .
}

rewrite指令接受需要重定向的原始地址以及新页面的目标地址。由于这里的更改不是临时的,我们在指令中也使用了permanent。您可以使用任意多个这样的重定向来确保在移动网站内容时,访问者不会看到不必要的404页面未找到错误。

结论

现在您已经了解了如何重定向请求到新的位置。确保使用正确的重定向类型,因为临时重定向的不当使用可能会影响您的搜索排名。

HTTP重定向还有多种其他用途,包括强制使用安全的SSL连接(即使用https而不是http),以及确保所有访问者最终只会进入网站的www.前缀地址。

正确使用重定向将允许您利用当前的网络存在,同时又能够根据需要修改站点结构。如果您想了解更多关于如何重定向您的访问者的方法,Nginx 在官方文档的rewrite 模块部分以及关于创建重定向的官方博客文章中都有很好的说明。

Source:
https://www.digitalocean.com/community/tutorials/how-to-create-temporary-and-permanent-redirects-with-nginx