简单的重写规则问题
这似乎很简单,但我无法弄清楚......我想所有的请求被重写为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 .... ..(我也尝试改变顺序)。
这让我开车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是一个真实的文件,而不是动态的)。
希望这可以帮助别人。
你可以用!
来反转匹配结果。所以:
RewriteRule ^404\.html$ 404.php
RewriteRule !^404\.html$ index.php [QSA]
这将匹配的路径不通过^404\.html$
匹配的任何请求。
您可能需要补充的是被注释掉的条件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^404\.html$ index.php [QSA]
现在,如果该请求可以额外不能被映射到一个现有的文件该规则将只匹配。
我建议这个解决方案:
Options +FollowSymlinks
RewriteEngine on
#RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^404.html$ 404.php [L]
RewriteRule ^(.*)$ index.php [QSA]
我认为问题是,你重写URL到404.php,然后将其发送到index.php。在第一条规则之后放置[L]将指示重写引擎不继续重写。
访问404.html仍然通过index.php重定向!我错过了什么? – Greg 2010-09-09 11:48:06
第三行表示'以下规则仅适用于所请求的文件名不是现有文件的情况。 (-f是一个文件,-d是一个目录,等等) – 2010-09-09 11:35:14