如何在 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>
caret 和 dollar 符号将使正则表达式匹配以 /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 文档以获取可用重写标志的完整列表。
与往常一样,如果您对本文有任何疑问或反馈,请随时使用下面的评论表。我们期待您的回音!