简单的RewriteRule问题

时间:2010-09-09 11:22:46

标签: .htaccess mod-rewrite

这看起来很简单,但我无法弄清楚...我希望所有请求都被重写为index.php(这将解释请求)除了 404.html应该直接重写为404.php。

以下代码可以将所有内容重写为index.php,但404.php永远不会被触发。

我已经留下了第3行的评论,因为我不知道它的作用。

Options +FollowSymlinks
RewriteEngine on
#RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^404.html$ 404.php [L]
RewriteRule ^(.*)$ index.php  [QSA]

正如你所看到的,我的需求非常简单,但我的大脑也是如此!请帮忙!

感谢。

修改

这条线本身很好用:

RewriteRule ^404.html$ 404.php

但是当引入另一个RewriteRule时,一切都被强制通过index.php - 甚至是404.html ......(我也试过更改顺序)。

3 个答案:

答案 0 :(得分:1)

您可以将匹配结果反转为!。所以:

RewriteRule ^404\.html$ 404.php
RewriteRule !^404\.html$ index.php [QSA]

这将匹配^404\.html$ 匹配的路径的任何请求。

您可能需要添加已注释掉的条件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^404\.html$ index.php [QSA]

现在,只有在请求无法映射到现有文件时,此规则才会匹配。

答案 1 :(得分:0)

我建议这个解决方案:

Options +FollowSymlinks
RewriteEngine on
#RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^404.html$ 404.php [L]
RewriteRule ^(.*)$ index.php  [QSA]

我认为问题在于您将URL重写为404.php,然后将其发送到index.php。在第一个规则之后放置[L]将指示重写引擎不继续重写。

答案 2 :(得分:0)

这让我 MAD!但是我找到了答案,对于那些像我一样感到困惑的人。

看第4行:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^404.html$ 404.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php

取自:easymodrewrite

如果您不清楚模块的行为方式,[L]标志可能会产生意外结果。请注意,以下内容仅适用于.htaccess文件中使用mod_rewrite时。在httpd.conf中使用时,[L]标志的行为完全符合预期。

L标志将告诉Apache停止处理该请求的重写规则。现在经常未实现的是,它现在对新的重写文件名发出新请求,并再次开始处理重写规则。


基本上,你必须告诉第二条规则不要匹配现有文件(404.php是真实文件,而不是动态文件)。

希望这有助于某人。