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

来自菜鸟教程
跳转至:导航、​搜索

介绍

HTTP 重定向或 URL 重定向是一种将一个域或地址指向另一个域或地址的技术。 重定向有很多用途,需要考虑几种不同类型的重定向。 每当站点需要将请求一个地址的人定向到另一个地址时,就会使用重定向。

当您创建内容和管理服务器时,您经常会发现需要将流量从一个地方重定向到另一个地方。 本指南将讨论这些技术的不同用例,以及如何在 Apache 和 Nginx 这两种最常见的 Web 服务器中实现它们。

先决条件

  • 按照 Ubuntu 20.04 初始服务器设置指南 设置的 Ubuntu 20.04 服务器,包括 sudo 非 root 用户和防火墙。
  • 您的服务器上安装了 Apache 或 Nginx,您可以按照 如何在 Ubuntu 20.04 上安装 Apache 或 如何在 Ubuntu 20.04 上安装 Nginx 来完成。 Apache 和 Nginx 可以同时安装,很多栈同时使用这两个服务器,但是默认情况下,它们会在默认的 HTTP/HTTPS 端口 80 和 443[ 上发生冲突X197X],因此如果您在库存服务器配置上遵循本教程,则一次只能安装一个。

第 1 步 – 审查重定向方法

重定向有很多用例。 如果您已经建立了网络形象并想更改您的域名,最好不要放弃您的旧域名。 如果您的内容在没有任何关于如何找到其新位置的指示浏览器的情况下消失,则指向您网站的书签和位于整个 Internet 其他页面上的指向您网站的链接将会中断。 更改域而不重定向将导致您的网站失去以前访问者的流量,并失去您努力建立的所有信誉。

通常,注册一个名称的多个变体是有帮助的,以便从用户键入与您的主域类似的地址中受益。 例如,如果您有一个名为 myspiders.com 的域,您还可以购买 myspiders.netmyspiders.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 中,您可以使用“重定向”指令实现单页重定向,该指令包含在默认启用的 mod_alias 模块中。 该指令至少需要两个参数:旧 URL 和新 URL。

Apache 服务器块可以存储在 /etc/apache2/apache2.conf 的主 Apache 设置文件中,但如果您在 /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 文件。

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
…
</VirtualHost>

如果您需要将 domain1.com 的请求重定向到 domain2.com,则可以从此服务器块中删除现有指令并用永久重定向替换它们:

/etc/apache2/sites-available/000-default.conf

<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 或临时重定向。 如果您想创建永久重定向,可以通过以下两种方式之一进行:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    ServerName www.domain1.com
Redirect 301 /oldlocation http://www.domain2.com/newlocation
</VirtualHost>

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    ServerName www.domain1.com
Redirect permanent /oldlocation http://www.domain2.com/newlocation
</VirtualHost>

使用 RedirectMatch 指令

要重定向多个页面,您可以使用 RedirectMatch 指令,它允许您使用正则表达式指定目录匹配模式。

这将允许您重定向整个目录,而不仅仅是单个文件。

RedirectMatch 匹配括号中的模式,然后使用“$1”在重定向中引用匹配的文本,其中 1 是第一组文本。 随后的组按顺序给出编号。

例如,如果您想将 /images 目录中的每个请求与名为 images.example.com 的子域匹配,则可以使用以下命令:

/etc/apache2/sites-available/default

<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 的信息,请参阅 How to Rewrite URLs with mod_rewrite for Apache

在本教程的下一部分中,您将学习一些使用 Nginx Web 服务器进行重定向的示例配置。 如果您已经安装并配置了 Apache,则需要在同一服务器上执行 Nginx 的配置步骤之前释放 80 端口。 您可以通过使用 apt remove 临时卸载 Apache 来完成此操作,如果您以后想要重新安装它,它将保留您的配置文件,或者通过更改 Apache 的配置以侦听除 80 以外的端口上的连接,该端口由默认情况下,Apache、Nginx 和所有 HTTP 连接。

第 3 步 – 如何在 Nginx 中重定向

Nginx 中的重定向是一项核心功能,它使用常见的 Nginx 指令。 大多数时候,您可以通过为每个 URL 创建一个新的服务器块来实现重定向。

Nginx 服务器块可以存储在 /etc/nginx/nginx.conf 的主要 Nginx 设置文件中,但如果您在 /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 文件。

/etc/nginx/sites-available/default

server {
        listen 80 default_server;
        listen [::]:80 default_server;
…
        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
…
}

如果您需要将 domain1.com 的请求重定向到 domain2.com,则可以从此服务器块中删除现有指令并用永久重定向替换它们:

/etc/nginx/sites-available/default

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。

为了处理文件夹重定向到单独的子域,您可以使用 rewrite 指令执行类似于 Apache 文件夹重定向的操作。 该指令在放置在服务器块中时,将为 images 目录内的请求发出临时重定向到子域 images.example.com

/etc/nginx/sites-available/default

server {
…
rewrite ^/images/(.*)$ http://images.example.com/$1 redirect;
…
}

对于永久重定向,您可以在语句末尾将 redirect 更改为 permanent

为了使您的更改生效,您需要重新启动 Nginx。 在现代 Ubuntu 服务器上,您可以使用 systemctl 执行此操作:

sudo systemctl restart nginx

您可以通过许多其他方式扩展此配置。 使用 Nginx 的这些基础知识来生成所需的服务器配置可以使您的堆栈非常精简,并有助于简明扼要地记录和处理围绕服务器流量的任何潜在边缘情况。

结论

在本教程中,您学习了为流行的 Web 服务器配置临时和永久重定向。 请务必使用正确的重定向类型,因为临时重定向的不当使用会损害您的搜索排名。

正确使用重定向将允许您利用当前的网络存在,同时允许您根据需要修改站点结构。 如果您想了解有关在 Nginx 中配置重定向的更多信息,可以阅读 如何使用 Nginx 创建临时和永久重定向