Apache mod_重写规则以防止查询字符串

Apache mod_重写规则以防止查询字符串,apache,mod-rewrite,Apache,Mod Rewrite,好的,我正在测试安装在我个人网络服务器上的cms(joomla),然后再将其上线。 我希望能够阻止使用查询字符串,或者更重要的是阻止用户在查询字符串上输入内容(如articleid等),但仍然允许内部重定向使用查询字符串 范例 阻止某人作为url输入 显示错误页面或重定向到index.php而不显示查询字符串 但仍然允许重写规则 重写规则^Register$index.php?option=com\u user&view=Register 重写cond%{QUERY_STRING}^$ 重写规

好的,我正在测试安装在我个人网络服务器上的cms(joomla),然后再将其上线。 我希望能够阻止使用查询字符串,或者更重要的是阻止用户在查询字符串上输入内容(如articleid等),但仍然允许内部重定向使用查询字符串

范例 阻止某人作为url输入

显示错误页面或重定向到index.php而不显示查询字符串

但仍然允许重写规则
重写规则^Register$index.php?option=com\u user&view=Register

重写cond%{QUERY_STRING}^$
重写规则^index.php$index.php?[R=301] 显然重定向所有查询字符串(但它也重定向/注册,这不是我想要的)

寄存器重写规则末尾的[L]标志也不会使其停止规则处理

编辑: 最后丹尼尔轻轻推了推回答这个问题。请参见下面的答案,答案是:

如果要删除现有查询字符串,请仅以问号结束替换字符串

尽管在这句话中没有提到,重写规则不能使用
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\u 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

好吧,虽然丹尼尔的回答没有完全起作用,但它让我走上了正确的道路。

最终需要两部分来完成我想要的,一部分是使用REDIRECT_STATUS变量

首先需要

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

这样,唯一可以使用的就是内部重定向定义的URL。

没有一个有效,它们仍然重定向了注册规则。最终需要两套不同的规则。编辑OP以显示。@Patrick:哦,当然!我忘记了mod_rewrite在重写URL时会重新应用重写规则。我已经更新了我的答案(并且这次测试了它以确保它有效)。“”“该死<代码>重写cond%{QUERY\u STRING}=“是否有效????要测试正则表达式中是否为空,这应该是
RewriteCond%{QUERY\u STRING}^$
@OlivierPons:“
RewriteCond%{QUERY\u STRING}!=”
有效吗?”这是问题还是陈述?除非有什么改变,否则当我在2011年1月3日尝试它时,它对我有效。这是一个问题(首先是“?”),我非常惊讶(所有其他的“?”)。然后我说如果不是空的话,我只知道一种测试方法,那就是
RewriteCond%{QUERY_STRING}^$。对不起,我没有正确地表达自己
RewriteRule .* - [F,L]