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

在本文中和接下来,我们将介绍如何使用mod_rewrite,将某些HTTP请求映射到网站中的其他网页或外部网址。

在本文中和接下来,我们将解释如何使用mod_rewrite,将某些HTTP请求映射到网站中的其他网页或外部网址。 换句话说,这个著名的Apache模块将允许你一个URL重定向到另一个,我们将通过实际的例子说明。

建议阅读: 5个窍门,以提高你的Apache Web服务器的性能

:下面的例子假设你至少有点熟悉Perl兼容正则表达式 (PCRE)。 由于该主题已经超出了本文的范围,请参阅Perl 5的版本24.0文档有关PCRE的更多细节。 在继续之前,请确保加载了重写模块。虽然这是在CentOS和类似的版本中,默认行为在Debian和衍生版本则需要按如下方式手动加载它:
# a2enmod rewrite

配置Apache使用mod_rewrite模块

为简单起见,我们使用默认的站点在CentOS 7 box(IP 192.168.0.100)解释如何使用mod_rewrite(DocumentRoot在/ var / www / html等 ,配置文件:/etc/httpd/conf/httpd.conf中 )。 为了使Apache使用此模块,请将以下行添加到配置文件:
RewriteEngine on
要注意,此配置将不会被继承这一点很重要虚拟主机在同一框。 因此,你需要上添加RewriteEngine叙述在您想使用重写规则,每个虚拟主机。
内部重定向:将URL映射到同一虚拟主机中的另一个
内部重定向mod_rewrite的最简单的例子。 如果你想重定向到Default.aspx的 index.html的所有请求,根据RewriteEngine叙述添加以下行(也称为重写规则)上:
RewriteRule "^/default\.aspx$" "/index.html"
并且不要忘记重新启动Apache,以使更改生效。 这也许派上用场,如果你的网站是使用ASP最初的设计,后来更改为纯HTML5。 搜索引擎将具有.aspx索引文件,但文件不存在了。 在这种情况下,您需要找到一种重定向请求的方法,以便您的潜在访问者不会遇到错误页面。为了测试,让我们创建一个名为简单的HTML文件index.html的/var/www/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>
插入符号美元符号将导致正则表达式匹配任何字符串开头/default和结尾.aspx分别。

建议阅读: 安装的mod_pagespeed以加快Apache的性能高达10倍

现在,启动浏览器并指出它192.168.0.100/default.aspx~~V。 如果一切如预期,Apache应该服务index.html来代替。 但是,最终用户将仍然可以看到default.aspx在地址栏导致变化是完全透明的:
将URL映射到域上的其他页面

将URL映射到域上的其他页面

如果你想在地址栏中的URL以表明它实际上服务于服务器index.html ,而不是一个名为页面default.aspx ,添加[R,L]按如下方式重写规则的结尾:
RewriteRule "^/default\.aspx$" "/index.html" [R,L]
这里[R,L]是指示,一个完整的HTTP重定向应该发出到浏览器两个可选标记(R)并且没有进一步的规则应进行处理:
将URL映射到实际索引页

将URL映射到实际索引页

注意地址栏现在怎么显示index.html ,符合市场预期,而不是default.aspx ,因为它以前所做的那样。
概要
在本文中,我们解释了如何使用mod_rewrite执行内部重定向。请继续关注下一篇文章,我们将了解如何重定向到已移动到其他服务器的资源,以及如何根据用户的浏览器显示自定义内容。在此之前,请参阅Apache 2.4的文档为可用的完整列表重写标志 。 一如既往,如果您对本文有任何疑问或反馈,请随时使用下面的评论表。我们期待您的回音!