重写规则(mod_rewrite)

3

这个重写规则是什么意思?

   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]

抱歉,即使我已经阅读了mod_rewrite语法说明,我还是不理解... :-/ 有人能解释一下这条规则的作用吗?
非常感谢。
2个回答

6

我将尝试简要解释一下,希望能让您理解。

首先:如果您从未使用过正则表达式,请先了解一下。

RewriteRule 由三部分组成。第一部分是用于搜索请求字符串的表达式,以查找特定模式。第二部分是实际从服务器返回的目标字符串。第三部分是放在方括号内的选项。

如果客户端按照正则表达式的格式向服务器发出请求,则实际上会调用并返回用户目标字符串,但用户不会看到此操作。正则表达式中任何括号内的内容都将保存以供在目标字符串中使用。

因此,在您的两个规则中(假设您的网站为 http://www.example.com/),会发生以下情况:

我输入 http://www.example.com,服务器将返回索引页面或文件列表(或已由先前的 .htaccess 文件确定的其他内容)。

我输入 http://www.example.com/page2.html,服务器将返回 app/webroot/page2.html。如果该文件不存在,则会显示 404 错误页面。

两个 RewriteRules 都以 [L] 结尾。这告诉 Apache 这是最后一个要遵循的规则。如果规则符合条件,Apache 将运行它,然后停止阅读其他规则。您可以使用其他选项,用逗号隔开。


如果我的表述中有任何让您感到困惑的地方,请告诉我,我会尽力加以修正。 - Jeff Rupert
非常感谢您的解释。在阅读了您的解释之后,第二条规则(RewriteRule (.*) app/webroot/$1 [L])现在对我来说完全有意义了。但是第一条规则是做什么用的呢?(...尤其是第一条规则中的“^$”对我来说似乎很奇怪)。再次感谢。 - Jennifer Weinberg
Seth解释得很清楚。在正则表达式中,^被定义为“字符串的开头”,而$被定义为“字符串的结尾”。在这种情况下,您有'^ $',它评估为空字符串。因此,服务器将评估为./app/webroot/,因为它不会查找文件。由于Apache处理这些“空”请求的方式,它可以返回我提到的任何内容。此外,它将附加'/',因为webroot是一个目录。 - Jeff Rupert
@Jeff Rupert,真希望我能给你双倍的赞。写得非常好!欢迎来到stackoverflow! - zen
@zen:谢谢!终于决定停止喷人,开始积极参与了。=D - Jeff Rupert

1

^$ 捕获对 / 的请求并将其重定向到 app/webroot/[L] 表示这是“最后”规则,这意味着如果此规则匹配请求,则 mod_rewrite 将停止处理。

(.*) 匹配任何内容,并将其重定向到 app/webroot/,并附加“任何内容”部分。同样,[L] 表示在触发此规则后停止处理。

第一条规则将捕获对 http://www.yoursite.com/ 的请求,将它们发送到 http://www.yoursite.com/app/webroot/(然后您的 Web 服务器将提供索引文档,例如 index.php,以满足请求)。

第二个规则将捕获任何其他请求,例如http://www.yoursite.com/path/to/some/page.php。 粗体部分被“捕获”,mod_rewrite将发送请求到http://www.yoursite.com/app/webroot/path/to/some/page.php

用户只会看到http://www.yoursite.com/

还要注意,这个表达式可能会导致问题。如果您键入http://www.yoursite.com/app/webroot/index.php,mod_rewrite将把请求更改为http://www.yoursite.com/app/webroot/app/webroot/index.php,这可能不是您想要的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接