防止查询字符串的mod_rewrite规则

4
我正在测试一个个人网站上安装的CMS(Joomla),希望在将其实际应用之前进行测试。我想要防止使用查询字符串,更确切地说是防止用户在查询字符串上输入内容(如更改文章ID等),但仍允许内部重定向使用查询字符串。
例如,防止某个人输入以下网址:
http://www.doamin.com/index.php?option=com_user&view=register
显示错误页面或重定向到不带查询字符串的index.php。
但仍允许重写规则
RewriteRule ^Register$ index.php?option=com_user&view=register RewriteCond %{QUERY_STRING} !^$ RewriteRule ^index.php$ index.php? [R=301] 显然,此规则会重定向所有查询字符串(但它也重定向/Register,这不是我想要的)。
最后,Register重写规则末尾的[L]标志并不能停止规则处理。
2个回答

4

mod_rewrite文档中提到:

如果您想要删除现有的查询字符串,请在替换字符串末尾仅使用问号。

虽然这句话没有提到,但重写规则不能使用QSA标志。

至于仍然允许重写规则:

RewriteRule ^Register$ index.php?option=com_user&view=register

您可能希望将其显示在去掉查询字符串的重写规则下方。当匹配成功时,%{ENV:REDIRECT_STATUS}变量被设置为200,然后mod_rewrite会再次运行重写规则。如果不使用检查%{ENV:REDIRECT_STATUS}不是200的规则,则第二次通过时,用于去除查询字符串的重写规则将匹配。

这将把所有对index.php(带或不带查询字符串)的请求映射到没有查询字符串的index.php,但仍允许将/Register视为/index.php?option=com_user&view=register

RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteRule ^index.php$ index.php?

RewriteRule ^Register$ index.php?option=com_user&view=register

或者,如果您希望在请求index.php时有查询字符串的情况下重定向到错误页面:

RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteCond %{QUERY_STRING} !=""
RewriteRule ^index.php$ error.php? [R,L]

RewriteRule ^Register$ index.php?option=com_user&view=register

但我只会使用F标志:

RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteCond %{QUERY_STRING} !=""
RewriteRule ^index.php$ - [F,L]

RewriteRule ^Register$ index.php?option=com_user&view=register

所有的方法都没有起作用,它们仍然将注册规则重定向。最终需要两组不同的规则。编辑原帖以显示。 - Patrick Evans
@Patrick:哦,当然!我忘记了mod_rewrite在重写URL时重新应用重写规则。我已经更新了我的答案(这次测试过了,确保它能正常工作)。 - Daniel Trebbien
°_° 该死!RewriteCond %{QUERY_STRING} !="" 是有效的吗???为了测试正则表达式中是否为空,应该使用 RewriteCond %{QUERY_STRING} !^$ - Olivier Pons
@OlivierPons: "RewriteCond %{QUERY_STRING} !="" 是有效的吗?" 这是一个问题还是陈述?除非有什么改变,当我在2011年1月3日尝试时,它对我有效。 - Daniel Trebbien
这是一个问题(第一个“?”),我对此非常惊讶(其他所有“?”)。然后我说我只知道一种测试是否不为空的方法,那就是RewriteCond %{QUERY_STRING} !^$。抱歉我没有表达清楚。 - Olivier Pons

2

好的,虽然丹尼尔的答案没有完全起作用,但它让我朝着正确的方向开始了。

最终需要两个部分来实现我想要的功能,其中一部分是使用REDIRECT_STATUS变量。

首先需要

RewriteCond %{QUERY_STRING} !=""<br>
RewriteCond %{ENV:REDIRECT_STATUS} 200<Br>
RewriteRule .* - [L]<br>

.....
所有我的内部重定向
例如:RewriteRule ^Register$ index.php?option=com_register&view=register [L]
.....

最后

RewriteRule .* - [F,L]

使得只有内部重定向定义的URL才能被使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接