2009-12-11 75 views
3

那个重写规则是什么意思?RewriteRule(mod_rewrite)

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

对不起,甚至阅读的mod_rewrite语法解释后,我并没有得到它...: -/ 有人可以给我解释一下什么是规则(s)没有。

非常感谢。

回答

6

我会尽量给出一个简单的解释,希望能为你解决这个问题。

第一:如果你从未使用正则表达式,那就去查看它。

重写规则是三个不同的部分。首先是用于搜索特定模式的请求字符串的表达式。其次是从服务器实际提供的目标字符串。第三是进入括号内的选项。

如果客户端以其中一个正则表达式的格式向服务器发出请求,则实际调用目标字符串并将其返回给用户,尽管用户看不到此操作。您的正则表达式中任何位于一组括号内的内容都将保存在目标字符串中。

所以,随着您的两个规则(假设你的网站是http://www.example.com/),下面会发生:

我输入http://www.example.com,服务器返回的索引页或已经由先前确定的filelisting(或别的东西。 htaccess文件)。

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

这两个RewriteRules在它们的最后有[L]。它所做的就是告诉Apache这是最后一条规则。如果规则适合,Apache将运行它,然后停止阅读更多规则。还有其他选项可以使用,用逗号分隔。

+0

如果有什么特别的我说让你困惑,让我知道,我会尝试修复它。 – 2009-12-11 02:20:46

+0

非常感谢您的解释。第二条规则(RewriteRule(。*)app/webroot/$ 1 [L])在阅读你的解释之后,对我来说是完全意义上的。 但是第一条规则是做什么的? (特别是第一条规则中的“^ $”对我来说似乎很陌生)。 再次感谢 – 2009-12-11 02:32:09

+0

塞斯解释得很好。 ^在正则表达式中被定义为'字符串开头',$被定义为'字符串结尾'。在这种情况下,您有'^ $',其计算结果为空字符串。因此,服务器将评估为./app/webroot/,因为它不查找文件。由于Apache处理这些“空”请求的方式,它可以返回我提到的任何东西。另外,它会追加'/',因为webroot是一个目录。 – 2009-12-11 02:38:11

1

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

(.*)匹配任何内容,并将其重定向到app/webroot/,并追加“任何”部分。 [L]同样意味着在此规则启动后停止处理。

第一条规则会赶上请求http://www.yoursite.com/,将它们发送到http://www.yoursite.com/app/webroot/(你的服务器将接发球了索引文件,比如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,这可能不是您想要的。

+0

非常感谢 – 2009-12-11 02:36:03