简介
HTTP 重定向,或者 URL 重定向,是一种将一个域名或地址指向另一个的技术。重定向有许多用途,也有几种不同的重定向方式需要考虑。当一个站点需要将请求一个地址的人重定向到另一个地址时,就会使用重定向。
在创建内容和管理服务器时,您经常会发现需要将流量从一个地方重定向到另一个地方。本指南将讨论这些技术的不同用例,以及如何在 Apache 和 Nginx 中实现它们,这两种是最常见的 Web 服务器。
先决条件
- 通过遵循 Ubuntu 20.04 初始服务器设置指南设置的 Ubuntu 20.04 服务器,包括一个 sudo 非根用户和防火墙。
- 在服务器上安装了 Apache 或 Nginx,您可以按照《如何在 Ubuntu 20.04 上安装 Apache》或《如何在 Ubuntu 20.04 上安装 Nginx》进行安装。默认情况下,Apache 和 Nginx 可以同时安装,许多堆栈同时使用这两个服务器,但是它们默认会在默认的 HTTP/HTTPS 端口 80 和 443 上发生冲突,因此,如果您正在使用默认服务器配置按照本教程操作,您应该一次只安装一个。
步骤 1 – 检查重定向方法
重定向有许多用例。如果您已经建立了网站,并且想要更改您的域名,最好不要只是放弃旧域名。如果您的内容消失而没有任何指示浏览器如何找到新位置,那么书签和其他网页上的链接将会失效。没有重定向地更改域名将导致您的网站失去以前访问者的流量,并且失去您努力建立的所有可信度。
通常,注册多个与主域名类似的名称是有帮助的,以便从用户输入与您的主域名类似的地址中受益。例如,如果您有一个名为 myspiders.com
的域名,您可能还会购买 myspiders.net
和 myspiders.org
的域名,并将它们都重定向到您的 myspiders.com
网站。这样可以帮助您捕捉那些可能使用错误地址访问您的网站的用户,并且可以防止其他网站使用类似的域名从您的网站中获利。
有时,有必要更改已经发布并在您的网站上接收流量的页面的名称。通常,这将导致 404 Not Found 错误,或者根据您的安全设置可能会导致其他错误。这些可以通过将您的访问者引导到包含他们试图访问的正确内容的另一个页面来避免。有几种不同类型的 URL 重定向,每种对客户端浏览器意味着不同的事情。最常见的两种类型是 302 临时重定向和 301 永久重定向。
临时重定向
如果您的某个 URL 的 Web 内容需要暂时从不同位置提供服务,那么临时重定向是有用的。例如,如果您正在进行网站维护,您可能需要将您的域的所有页面临时重定向到一个解释页面,以通知您的访问者您很快就会回来。
临时重定向通知浏览器,内容暂时位于不同位置,但他们应该继续尝试访问原始 URL。
永久重定向
当您的内容永久移动到新位置时,永久重定向是有用的。
当您需要更改域名或者 URL 需要因其他原因更改,并且旧位置将不再使用时,这是有用的。此重定向通知浏览器,它不应再请求旧 URL,并且应更新其信息以指向新 URL。
强制 SSL
重定向的一个常见用途是将所有站点流量重定向到使用 SSL 而不是标准 HTTP。
使用重定向,可以使所有对 http://www.mysite.com
的请求重定向到 https://www.mysite.com
。使用 LetsEncrypt 提供 HTTPS 将自动生成这样的重定向配置。
在本教程的下一部分,您将学习使用 Apache Web 服务器的重定向的一些示例配置。如果您使用的是 Nginx,并且没有使用 Apache 的计划,您可以跳过到第 3 步。
步骤 2 – 在 Apache 中进行重定向
Apache 可以使用几种不同的工具进行重定向。可以使用 mod_alias
模块中的工具实现直接重定向,并且可以使用 mod_rewrite
创建更广泛的重定向。
使用重定向指令
在 Apache 中,您可以使用 “Redirect” 指令来实现单页面重定向,该指令包含在默认情况下启用的 mod_alias
模块中。此指令至少需要两个参数:旧 URL 和新 URL。
Apache 服务器块可以存储在主 Apache 设置文件 /etc/apache2/apache2.conf
中,但如果为每个配置创建一个新文件放在 /etc/apache2/sites-available/
中会更易于维护。Apache 的约定是创建符号链接(类似快捷方式)从 sites-available/
中的文件到另一个名为 sites-available/
的文件夹,以便在决定启用或禁用它们时使用。默认情况下,Apache 安装了一个单个站点特定配置在 /etc/apache2/sites-available/000-default.conf
中,它是启用的,并且链接到 /etc/apache2/sites-enabled/000-default.conf
。
您可以使用 nano
或您喜欢的文本编辑器打开该配置:
sudo nano /etc/apache2/sites-available/000-default.conf
默认情况下,它包含一个标准的 Web 服务器配置,将监听端口 80,并在您的系统上的 /var/www/html
中查找 index.html
文件。
<VirtualHost *:80> # ServerName 指令设置服务器用于标识自身的请求方案、主机名和端口。在创建重定向 URL 时使用。在虚拟主机的上下文中,ServerName 指定了请求的 Host: 头中必须出现的主机名,以匹配此虚拟主机。对于默认虚拟主机(此文件),此值并不决定性,因为它作为最后的备用主机使用。但是,对于任何进一步的虚拟主机,您必须明确设置它。 #ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html … </VirtualHost>
如果您需要将对 domain1.com
的请求重定向到 domain2.com
,您可以从此服务器块中删除现有指令,并用永久重定向替换它们:
<VirtualHost *:80> ServerName www.domain1.com Redirect / http://www.domain2.com </VirtualHost> <VirtualHost *:80> ServerName www.domain2.com . . . . . . </VirtualHost>
保存并关闭文件。如果您使用的是 nano
,请按下 “Ctrl+X”,然后在提示时输入 “Y”,然后按 Enter。
此重定向指示浏览器将所有对 www.domain1.com
的请求重定向到 www.domain2.com
。这仅适用于单个页面,而不适用于整个站点。
默认情况下,Redirect
指令建立一个 302 或临时重定向。如果您想创建一个永久重定向,可以通过以下两种方式之一实现:
<VirtualHost *:80> ServerName www.domain1.com Redirect 301 /oldlocation http://www.domain2.com/newlocation </VirtualHost>
<VirtualHost *:80> ServerName www.domain1.com Redirect permanent /oldlocation http://www.domain2.com/newlocation </VirtualHost>
使用 RedirectMatch 指令
要重定向多个页面,可以使用 RedirectMatch
指令,它允许您使用正则表达式指定目录匹配模式。
这将允许您重定向整个目录,而不仅仅是单个文件。
RedirectMatch
匹配括号中的模式,然后使用 “$1” 在重定向中引用匹配的文本,其中 1 是文本的第一组。随后的组按顺序编号。
例如,如果您想要将对 /images
目录中的任何内容的请求重定向到名为 images.example.com
的子域,您可以使用以下内容:
<VirtualHost *:80> … RedirectMatch ^/images/(.*)$ http://images.example.com/$1 … </VirtualHost>
与 Redirect
指令一样,您可以通过在 URL 位置规则之前添加重定向代码来指定重定向的类型。
为使更改生效,您需要重新启动 Apache。在现代 Ubuntu 服务器上,您可以使用 systemctl
来执行此操作:
sudo systemctl restart apache2
使用 mod_rewrite 进行重定向
创建重定向规则的最灵活但也最复杂的方法是使用名为 mod_rewrite
的模块。有关使用 mod_rewrite
的信息,请参阅有关如何使用 Apache 的 mod_rewrite
重写 URL。
在本教程的下一部分中,您将学习使用 Nginx Web 服务器进行重定向的一些示例配置。如果您已经安装并配置了 Apache,则需要在遵循 Nginx 的配置步骤之前,确保在同一服务器上空闲了端口 80。您可以通过使用 apt remove
暂时卸载 Apache(这样做将保留您的配置文件,以便以后重新安装它),或者通过更改 Apache 的配置以侦听除 80 之外的端口来实现这一点,因为默认情况下,端口 80 被 Apache、Nginx 和所有 HTTP 连接使用。
步骤 3 – 在 Nginx 中进行重定向
Nginx 中的重定向是一个核心功能,并且利用了常见的 Nginx 指令。大多数情况下,您可以通过为每个 URL 创建一个新的服务器块来实现重定向。
Nginx 服务器块可以存储在主 Nginx 设置文件 /etc/nginx/nginx.conf
中,但如果您为每个配置创建一个新文件放在 /etc/nginx/sites-available/
中,那么它们将更易于维护。Nginx 的约定是创建符号链接(类似于快捷方式)从 sites-available/
中的文件到另一个名为 sites-available/
的文件夹,以便您决定是否启用或禁用它们。默认情况下,Nginx 安装了一个单独的站点配置文件 /etc/nginx/sites-available/default
,它已启用并链接到 /etc/nginx/sites-enabled/default
。
您可以使用 nano
或您喜欢的文本编辑器打开该配置:
sudo nano /etc/nginx/sites-available/default
默认情况下,它包含一个标准的 Web 服务器配置,将侦听端口 80,并在您的系统上查找位于 /var/www/html
中的 index.html
文件。
server { listen 80 default_server; listen [::]:80 default_server; … root /var/www/html; # 如果您使用 PHP,则将 index.php 添加到列表中 index index.html index.htm index.nginx-debian.html; … }
如果您需要将对 domain1.com
的请求重定向到 domain2.com
,您可以从此服务器块中删除现有指令,并用永久重定向替换它们:
server { listen 80; server_name domain1.com; return 301 $scheme://domain2.com$request_uri; }
保存并关闭文件。如果您使用的是 nano
,请按下 “Ctrl+X”,然后在提示时输入 “Y”,然后按 Enter。
return
指令执行 URL 替换,然后返回给定的状态代码和重定向 URL。
在这种情况下,它使用 $scheme
变量来使用原始请求中使用的任何方案(http 或 https)。然后返回 301 永久重定向代码和新形成的 URL。
为了将文件夹重定向到单独的子域,您可以执行类似于 Apache 文件夹重定向的操作,使用 rewrite
指令。将此指令放在服务器块中,将会为 images
目录内的请求发出临时重定向到子域 images.example.com
:
server { … rewrite ^/images/(.*)$ http://images.example.com/$1 redirect; … }
对于永久重定向,您可以在语句的末尾将 redirect
更改为 permanent
。
为使更改生效,您需要重新启动 Nginx。在现代 Ubuntu 服务器上,您可以使用 systemctl
来执行此操作:
sudo systemctl restart nginx
您可以以许多其他方式扩展此配置。使用 Nginx 的这些基本功能来生成所需的服务器配置,可以使您的堆栈非常精简,并有助于简洁地记录和处理服务器流量可能出现的任何潜在边缘情况。
结论
在本教程中,您学习了如何为流行的 Web 服务器配置临时重定向和永久重定向。请确保使用正确的重定向类型,因为不正确使用临时重定向可能会损害您的搜索排名。
正确使用重定向将允许您利用当前的网站存在,同时允许您根据需要修改网站结构。如果您想了解如何在 Nginx 中配置重定向的更多信息,可以阅读《如何在 Nginx 中创建临时重定向和永久重定向》。