2010-09-09 48 views
4

这似乎很简单,但我无法弄清楚......我想所有的请求被重写为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 

,而是引入了其他重写规则的时候,一切都被通过的index.php强制 - 甚至404.html .... ..(我也尝试改变顺序)。

+1

第三行表示'以下规则仅适用于所请求的文件名不是现有文件的情况。 (-f是一个文件,-d是一个目录,等等) – 2010-09-09 11:35:14

回答

0

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

看行4:easymodrewrite

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

来自

的[L]标志可以有意想不到的效果,如果你不是在模块的行为明确。请注意,以下内容仅适用于在.htaccess文件中使用mod_rewrite的情况。使用httpd.conf时,[L]标志的行为与预期完全相同。

L标志将告诉Apache停止处理该请求的重写规则。现在通常没有意识到的是,它现在对新的重新编写的文件名提出新的请求,并且再次开始处理重写规则。


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

希望这可以帮助别人。

1

你可以用!来反转匹配结果。所以:

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

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

您可能需要补充的是被注释掉的条件:

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

现在,如果该请求可以额外不能被映射到一个现有的文件该规则将只匹配。

+0

我不明白这是如何帮助的 - 我希望404.html被重写为404.php ...和其他一切index.php与请求者作为查询字符串。 – Greg 2010-09-09 11:28:24

+0

@Greg:修正了这个问题。 – Gumbo 2010-09-09 11:30:20

+0

嗯,使用你放什么,请求404.html仍然被定向到index.php ...我做错了什么? – Greg 2010-09-09 11:37:39

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]将指示重写引擎不继续重写。

+0

访问404.html仍然通过index.php重定向!我错过了什么? – Greg 2010-09-09 11:48:06