2009-06-02 120 views
2

我想让URL重写在我的网站上工作。这里是我的.htaccess的内容:Apache URL重写,

RewriteEngine On 
RewriteRule ^blog/?$ index.php?page=blog [L] 
RewriteRule ^about/?$ index.php?page=about [L] 
RewriteRule ^portfolio/?$ index.php?page=portfolio [L] 
#RewriteRule ^.*$ index.php?page=blog [L] 

现在3条注释掉重写规则很好地工作,如果我尝试http://www.mysite.com/blog/,我重定向到http://www.mysite.com/index.php?page=blog,同为“约”和“组合”。但是,如果我输错博客,假设我尝试http://www.mysite.com/bloh/,那么很明显我会遇到404错误。评论的最后一条规则是帮助防止这种情况发生。任何URL都应该被重定向到博客,但是当然,即使我们已经成功地使用了前一个,这个规则仍然被解析,所以我使用了“last”标志([L])。如果我取消注释我的最后一条规则,则任何内容(包括博客,关于和投资组合)都将重定向到博客。一旦找到匹配规则,“last”标志不应该立即停止执行吗?

谢谢。

回答

2

你可以添加一个条件,如:

RewriteCond %{REQUEST_URI} !^index\.php 

我还会提到,使用RewriteRule ^.*$是打破所有的媒体请求(CSS,JS,图像),以及一个好办法。您可能要添加一些条件,如:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

要确保你没有试图改写实际文件或目录的服务器上存在。否则,他们将无法访问,除非index.php也服务于这些!

3

是的,最后一个标记表示它不会应用此规则之后的任何规则

重写URL后,它会使用新的重写URL进行内部请求,该URL将与您最近的RewriteRule相匹配,因此您的重定向会进入无限循环。

使用RewriteCond指令将重写限制为不以index.php开头的URL,并且您应该没问题。

1

从Apache的mod_rewrite docs

'最后| L'(最后一条规则) 停止重写的过程这里不适用任何更多重写 规则。这对应于Perl 上一个命令或 C中的中断命令。使用此标志可防止当前重写的URL 被 按以下规则进一步重写。 但是请记住,如果 重写规则生成内部 重定向(其经常发生当 在每个目录上下文重写), 这将重新注入该请求并 将导致重复 处理从第一开始重写规则。

你可以使用

ErrorDocument 404 /index.php?page=blog 

,但你应该知道的事实,它不返回404错误代码,而是一个重定向一个,我不知道这是否是这样的良好的做法。

+0

感谢您的回答。如果仔细观察,我当前的正则表达式已经考虑了可选的尾部斜杠。 – 2009-06-02 19:06:09

+0

哦,是的。我没有看到。对不起:) – andi 2009-06-02 19:41:31

1

在[L]对请求进行预处理后,整个处理将再次运行新的(重写的)URL。您可以使用此您的其他规则之前离开该循环:

RewriteRule ^index.php - [L] 

,这意味着“为的index.php,不重写,离开处理。”