这看起来很简单,但我无法弄清楚...我希望所有请求都被重写为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 ......(我也试过更改顺序)。
答案 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是真实文件,而不是动态文件)。
希望这有助于某人。