网站搜索

如何在 Apache 中使用 mod_rewrite 执行内部重定向


在本文和下一篇文章中,我们将解释如何使用 mod_rewrite 将某些 HTTP 请求映射到网站中的其他页面或外部 URL。

换句话说,这个著名的 Apache 模块将允许您将 URL 重定向到另一个 URL,我们将通过实际示例进行说明。

建议阅读: 提升 Apache Web 服务器性能的 5 个技巧

注意:下面的示例假设您至少对Perl 兼容正则表达式 (PCRE) 有所了解。由于该主题超出了本文的范围,因此请参阅 Perl 5 版本 24.0 文档以获取有关 PCRE 的更多详细信息。

在继续之前,请确保重写模块已加载。虽然这是 CentOS 和类似发行版中的默认行为,但在 Debian 和衍生版本中,您需要手动加载它,如下所示:

a2enmod rewrite

配置 Apache 使用 mod_rewrite 模块

为了简单起见,我们使用 CentOS 7 框中的默认站点 (IP 192.168.0.100) 来解释如何使用 mod_rewrite ( DocumentRoot/var/www/html,配置文件:/etc/httpd/conf/httpd.conf)。

为了让 Apache 使用此模块,请将以下行添加到配置文件中:

RewriteEngine on

需要注意的是,此配置不会被同一个盒子中的虚拟主机继承。

因此,您需要为要使用重写规则的每个虚拟主机添加RewriteEngine

内部重定向:将一个 URL 映射到同一虚拟主机中的另一个 URL

内部重定向是mod_rewrite最简单的例子。如果要将 default.aspx 的所有请求重定向到 index.html,请在 RewriteEngine 下添加以下行(也称为重写规则) > 于:

RewriteRule "^/default\.aspx$" "/index.html"

并且不要忘记重新启动 Apache 以使更改生效。

如果您的网站最初是使用 ASP 设计的,后来更改为纯 HTML5,这可能会派上用场。搜索引擎会将 .aspx 文件编入索引,但该文件不再存在。

在这种情况下,您需要找到一种方法来重定向请求,以便您的潜在访问者不会遇到错误页面。为了进行测试,我们在 /var/www/html 中创建一个名为 index.html 的简单 HTML 文件,其中包含以下内容:

<!DOCTYPE html>
<html>
  <head>
	<meta charset="utf-8">
	<title>New site</title>
  </head>
  <body>
	<h2>Default.aspx was here, but now it's index.html</h2>
  </body>
</html>

caretdollar 符号将使正则表达式匹配以 /default 开头并以 .aspx 结尾的任何字符串> 分别。

建议阅读: 安装 Mod_Pagespeed 将 Apache 性能提升至 10 倍

现在启动浏览器并将其指向192.168.0.100/default.aspx。如果事情按预期进行,Apache 应该提供 index.html 服务。
但是,最终用户仍然会在地址栏中看到 default.aspx ,从而使更改完全透明:

如果您希望地址栏中的 URL 显示其实际提供的服务器是 index.html,而不是名为 default.aspx 的页面,请添加 [R, L] 到末尾的重写规则如下:

RewriteRule "^/default\.aspx$" "/index.html" [R,L]

这里[R,L]是两个可选标志,指示应向浏览器(R)发出完整的HTTP重定向,并且不应处理进一步的规则:

请注意,地址栏现在如何按预期显示 index.html,而不是像之前那样显示 default.aspx

概括

在本文中,我们解释了如何使用 mod_rewrite 来执行内部重定向。请继续关注下一篇文章,我们将学习如何重定向到已移动到不同服务器的资源,以及如何根据用户的浏览器显示自定义内容。在此之前,请参阅 Apache 2.4 文档以获取可用重写标志的完整列表。

与往常一样,如果您对本文有任何疑问或反馈,请随时使用下面的评论表。我们期待您的回音!