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

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

介绍

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

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

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

您可以通过在服务器配置文件的虚拟主机条目中添加这样的行来在 Apache 中创建临时重定向:

Redirect /oldlocation http://www.newdomain.com/newlocation

同样,使用这样的行进行永久重定向:

Redirect permanent /oldlocation http://www.newdomain.com/newlocation

本指南将更深入地解释如何在 Apache 中实现各种重定向,并通过一些特定用例的示例。

先决条件

要遵循本教程,您将需要:

解决方案一览

在 Apache 中,您可以使用 Redirect 指令完成简单的单页重定向,该指令包含在 mod_alias 模块中,在全新的 Apache 安装中默认启用。 该指令至少需要两个参数,旧 URL 和新 URL,可用于创建临时和永久重定向。

在最简单的形式中,您可以在服务器配置中使用以下行完成临时重定向:

使用重定向的临时重定向

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

<VirtualHost *:80>
    ServerName www.domain2.com
    . . .
</VirtualHost>

此重定向指示浏览器将对 www.domain1.com 的所有请求定向到 www.domain2.com。 但是,此解决方案仅适用于单个主页,而不适用于整个站点。

要重定向多个页面,您可以使用 RedirectMatch 指令,该指令使用 正则表达式 来指定整个目录,而不仅仅是单个文件。 RedirectMatch 匹配括号中的正则表达式模式,然后使用 $1 表达式引用重定向目标中的匹配文本,其中 1 是第一组匹配文本。 在更复杂的示例中,后续匹配的组按顺序给出编号。

例如,如果您想将 www.domain1.com 中的每个页面临时重定向到 www.domain2.com,您可以使用以下命令:

使用 RedirectMatch 进行临时重定向

<VirtualHost *:80>
    ServerName www.domain1.com
    RedirectMatch ^/(.*)$ http://www.domain2.com/$1
</VirtualHost>

<VirtualHost *:80>
    ServerName www.domain2.com
    . . .
</VirtualHost>

默认情况下,RedirectRedirectMatch 指令都会建立临时重定向。 如果您想创建永久重定向,可以通过将 permanent 附加到任一指令来实现:

永久重定向

Redirect permanent / http://www.domain2.com
RedirectMatch permanent ^/(.*)$ http://www.domain2.com/$1

您还可以使用 mod_rewrite 模块创建更灵活、更强大的重定向。 这超出了本文的范围,但您可以从 如何为 Apache 设置 mod_rewrite 中的 mod_rewrite 开始。

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

示例 1 - 移动到不同的域

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

在此示例中,我们将配置从名为 domain1.com 的旧域到名为 domain2.com 的新域的重定向。 我们将在这里使用永久重定向,因为旧域将被删除,从现在开始所有流量都应该转到新域。

假设您已将网站配置为从已在 Apache 中配置的名为 domain1.com 的单个域提供服务,如下所示:

/etc/apache2/sites-available/domain1.com.conf

<VirtualHost *:80>
    ServerAdmin admin@domain1.com
    ServerName domain1.com
    ServerAlias www.domain1.com
    DocumentRoot /var/www/domain1.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

我们还将假设您已经在 domain2.com 上提供您未来版本的网站:

/etc/apache2/sites-available/domain2.com.conf

<VirtualHost *:80>
    ServerAdmin admin@domain2.com
    ServerName domain2.com
    ServerAlias www.domain2.com
    DocumentRoot /var/www/domain2.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

让我们更改 domain1.com 虚拟主机配置文件以添加永久重定向到 domain2.com

/etc/apache2/sites-available/domain1.com.conf

<VirtualHost *:80>
    ServerAdmin admin@domain1.com
    ServerName domain1.com
    ServerAlias www.domain1.com    
    DocumentRoot /var/www/domain1.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    RedirectMatch permanent ^/(.*)$ http://domain2.com/$1
</VirtualHost>

我们使用 RedirectMatch 指令添加了上述重定向。 我们使用 RedirectMatch 而不是简单的 Redirect 来确保所有网站页面都会受到影响,而不仅仅是主页。 ^/(.*)$ 正则表达式匹配 URL 中 / 之后的所有内容。 例如,http://domain1.com/index.html 将被重定向到 http://domain2.com/index.html。 为了实现永久重定向,我们只需在 RedirectMatch 指令之后添加 permanent

注意: 更改配置后记得使用systemctl restart apache2重启Apache。


示例 2——尽管有单个页面名称更改,但仍创建持久体验

有时,有必要更改已在您的网站上发布并获得流量的各个页面的名称。 单独更改名称会导致尝试访问原始 URL 的访问者出现 404 Not Found 错误,但您可以通过使用重定向来避免这种情况。 这样可以确保为您的旧页面添加书签或通过搜索引擎上过时的链接找到它们的人仍然会到达正确的页面。

假设您的网站有两个单独的产品和服务页面,分别称为 products.htmlservices.html。 现在,您决定将这两个页面替换为一个名为 offers.html 的报价页面。 我们将为 products.htmlservices.html 配置一个简单的重定向到 offers.html

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

假设的原始虚拟主机配置

<VirtualHost *:80>
    ServerName example.com
    . . .
</VirtualHost>

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

添加到原始配置的重定向

<VirtualHost *:80>
    ServerName example.com
    
    Redirect permanent /products.html /offer.html
    Redirect permanent /services.html /offer.html
    . . .
</VirtualHost>

Redirect 指令接受必须重定向的原始地址以及新页面的目标地址。 由于此处的更改不是临时更改,因此我们也在指令中使用了 permanent。 您可以使用尽可能多的重定向,以确保您的访问者在移动网站内容时不会看到不必要的未找到错误。

结论

您现在已经掌握了将请求重定向到新位置的知识。 请务必使用正确的重定向类型,因为临时重定向的不当使用会损害您的搜索排名。

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

正确使用重定向将允许您利用当前的网络存在,同时允许您根据需要修改站点结构。 如果您想了解更多关于重定向访问者的方法,Apache 在官方文档的 mod_aliasmod_rewrite 部分中提供了有关该主题的精彩文档。