【问题标题】:mod_rewrite rule to prevent query stringmod_rewrite 规则以防止查询字符串
【发布时间】:2011-06-02 14:44:26
【问题描述】:

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

示例 防止某人作为 url 进入
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 rewriterule 末尾的 [L] 标志也不会使其停止规则处理。

编辑: 最后在丹尼尔的推动下回答了这个问题。请看下面的答案

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    mod_rewrite documentation 说:

    当您想删除现有的查询字符串时,只用问号结束替换字符串。

    虽然这句话中没有提到,但重写规则不能使用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
    

    【讨论】:

    • 这些都不起作用,他们仍然重定向了注册规则。最终需要两套不同的规则。编辑 OP 以显示。
    • @Patrick:哦,当然!我忘记了无论何时重写 URL,mod_rewrite reapplies 重写规则。我已经更新了我的答案(这次并对其进行了测试以确保它有效)。
    • °_° 该死的! RewriteCond %{QUERY_STRING} !="" 有效???要在正则表达式中测试是否为空,这应该是 RewriteCond %{QUERY_STRING} !^$
    • @OlivierPons:“RewriteCond %{QUERY_STRING} !="" 有效吗?”这是一个问题还是一个陈述?除非有什么改变,否则当我在 2011 年 1 月 3 日尝试时,它对我有用。
    • 这是一个问题(第一个'?'),我很惊讶(所有其他的'?')。然后我说我只知道一种测试方法,如果 not empty,那就是 RewriteCond %{QUERY_STRING} !^$ 。对不起,我没有正确表达自己
    【解决方案2】:

    好的,虽然丹尼尔斯的回答没有完全奏效,但它让我开始走上正确的道路。

    最终需要两部分来做我想做的事,其中一部分是使用 REDIRECT_STATUS 变量

    首先需要

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

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

    最后

    RewriteRule .* - [F,L]
    

    使得唯一可以使用的是内部重定向定义的 url。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多