如何将“其他所有”规则添加到mod_rewrite

时间:2012-08-21 21:06:55

标签: apache mod-rewrite

如果没有满足其他规则,我如何让mod_rewrite重定向到某个页面,或者可能只抛出404?这是我在.htaccess文件中的内容:

RewriteEngine on

RewriteRule ^\. / [F,QSA,L]
RewriteRule ^3rdparty(/.*)$ / [F,QSA,L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^((images|upload)/.+|style.css)$ $1 [L]

RewriteRule ^$ special [QSA]
RewriteRule ^(special|ready|building|feedback)/?$ $1.php [QSA,L]
RewriteRule ^(ready|building)/(\d+)/?$ show_property.php?type=$1&property_id=$2 [QSA,L]

RewriteRule . error.php?code=404 [QSA,L]

除其他事项外,假设用户尝试访问此处未明确指定的任何内容(顺便说一下,抛出404的正确方法是什么?),这可以用来发送给error.php。但是,它会将用户从每个页面发送到error.php。如果我删除最后一条规则,其他一切都有效。

我做错了什么?

5 个答案:

答案 0 :(得分:1)

发生的事情是,当您进行重写时,然后将用户发送到新URL,然后再次评估这些重写规则。最终不会触发其他重定向规则,它将进入最终规则并始终重定向到error.php页面。

因此,您需要设置一些重写条件,以避免这种情况发生。

答案 1 :(得分:1)

重写引擎循环,因此您需要在最终重写为error.php之前通过成功的重写。也许是这样的:

RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} !^/(special|ready|building|feedback|show_property)\.php
RewriteCond %{REQUEST_URI} !^/((images|upload)/.+|style.css)$
RewriteRule ^ error.php?code=404 [QSA,L,R=404]

每个条件都确保URI不是您的其他规则重写的其中一个。

R=404将重定向到error.php页面,作为" 404 Not Found"。


  

不幸的是,它没有用 - 它允许访问服务器上的所有文件(可能是因为所有条件都需要满足)。我尝试了另一种解决方案:

其他东西必须滑倒,尽管当我在一个空白的htaccess文件中测试你的规则加上这些时,它似乎有效。你可以尝试的其他东西有点不太好但是因为你实际上没有将浏览器重定向到任何地方,所以它会被客户隐藏。

您在所有规则的末尾都有一个QSA标记,您可以在应用规则后为查询字符串添加一个唯一的参数,然后再对其进行检查。例如:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^((images|upload)/.+|style.css)$ $1?_ok [L,QSA]

然后在最后:

RewriteCond %{QUERY_STRING} !_ok
RewriteRule ^ error.php?code=404&_ok [QSA,L,R=404]    

答案 2 :(得分:0)

理论上如果没有匹配的规则(并且请求的URL不存在),它已经是404.所以我认为最简单的解决方案是使用ErrorDocument,然后重写它:

RewriteEngine On

ErrorDocument 404 /404.php
RewriteRule ^404.php$ error.php?code=404 [L]

# All your other rules here...

您可以对任何其他HTTP错误代码执行相同的操作。

答案 3 :(得分:0)

这里的问题是,在mod_rewrite完成重写URL之后,会重新提交到mod_rewrite以进行另一次传递。因此,[L]标志仅使当前传递的规则成为最后一个。从{2.3}开始,mod_rewrite[END]更好地解释了,现在支持另一个标志 - mod_rewrite,它使当前的RewriteRule ^((images|upload)/.+|style.css|(special|ready|building|feedback|property).php)$ - [QSA,L] RewriteRule .* - [QSA,L,R=404] 通过最后一个。{{1}}。对于Apache 2.2,提供了许多解决方案,但由于其中一个有点笨拙而另一个无效,我目前的解决方案是添加另外两个规则,允许访问特定的文件集,同时为所有内容发送404否则:

{{1}}

答案 4 :(得分:-1)

我认为你的最后一条规则应该是

RewriteRule ^(.*)$ error.php?code=404&query=$1 [QSA,L]

你可以省略括号和$ 1参数,但也许知道用户试图实现的目的是有用的。

希望,这可以解决问题!