0

如果没有其他规则得到满足,我如何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]

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

我究竟做错了什么?

4

5 回答 5

1

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

所以你需要设置一些重写条件来避免这种情况发生。

于 2012-08-21T21:17:37.120 回答
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]    
于 2012-08-21T21:17:45.660 回答
0

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

RewriteEngine On

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

# All your other rules here...

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

于 2012-08-21T21:27:53.093 回答
0

这里的问题是,在mod_rewrite完成 URL 的重写之后,它被重新提交给mod_rewrite另一个 pass。因此,该[L]标志仅使规则持续到当前通过。正如这个问题中更好地解释的那样,mod_rewrite从 Apache 版本 2.3.9 开始,现在支持另一个标志 - [END],这使得当前mod_rewrite通过最后一个。对于 Apache 2.2,提供了许多解决方案,但由于其中一个有点笨拙,另一个不起作用,我当前的解决方案是添加另外两个规则,允许访问一组特定的文件,同时为所有内容发送 404别的:

RewriteRule ^((images|upload)/.+|style.css|(special|ready|building|feedback|property).php)$ - [QSA,L]
RewriteRule .* - [QSA,L,R=404]
于 2012-08-23T10:30:32.150 回答
-1

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

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

您可以省略括号和 $1 参数,但了解用户试图实现的目标可能很有用。

希望,这可以解决问题!

于 2012-08-21T21:11:06.847 回答