【问题标题】:Selecting for special characters with rewriterule in htaccess file在 htaccess 文件中使用重写规则选择特殊字符
【发布时间】:2013-01-29 17:48:44
【问题描述】:

我犯了一个小错误(我在现有的 php 调用中开始了一个新的 php 调用 - 哎呀)并设法让谷歌开始抓取一大堆看起来像这样的 url:

http://www.mydomain.com/folder/parameter/%3C/?php%20echo%20writelink();%20?%3E

我已经修复了源调用,但我尝试让 .htaccess 重写页面调用

http://www.mydomain.com/folder/parameter/

没有成功。

我尝试了以下方法:

RewriteRule  ^folder/(.*)/(.*)%(.*) /folder/$1/ [NE,R=301,L]
RewriteRule  ^folder/(.*)/(.*)3C/?php /folder/$1/ [R=301,L]
RewriteRule  ^folder/(.*)/(.*)writelink /folder/$1/ [R=301,L]
RewriteRule  ^folder/(.*)/([^/.]+)writelink /folder/$1/ [R=301,L]

但所有这些都返回相同的 403。 我将测试重写器作为文件中的第一个重写器,所以它没有被其他东西篡夺。

(供参考,当我没有弄脏页面时,正确的重写是 RewriteRule ^folder/(.*)/$ /content/element.php?param=$1 [L] )

我之前在路径中遇到过 %ages 问题,但这次我决定解决它 - 有什么建议吗?

【问题讨论】:

    标签: .htaccess mod-rewrite special-characters


    【解决方案1】:

    你的网址是这样的:

    http://www.mydomain.com/folder/parameter/</?php echo writelink(); ?> 没有编码。

    304 代码并不真正表示错误,它表示请求的 URL 的资源自上次访问或缓存后没有更改。清除浏览器的缓存并确保已清除。

    错误应该是403(禁止),因为初始字符< (%3C)

    这些错误使 .htaccess 中的任何重写规则都无效。处理此类问题的一种方法是使用脚本。

    示例

    将这些行添加到根目录下的 .htaccess 文件中:

    Options +FollowSymlinks -MultiViews
    ErrorDocument 403 /Error403.php
    

    在根目录下创建Error403.php,内容与此类似:

    <?php
    // The following lines should be at the top of the file
    
    /**************Only for Debugging**********************/
    echo $_SERVER[ 'REDIRECT_QUERY_STRING' ] . "<br /><br />"; 
    echo var_dump($_REQUEST) . "<br /><br />";
    /*=====================================================
    NOTE: A Header error might be generated while the above 
    code is active. Use it only to display the incoming 
    parameters and delete it for normal operation.
    *******************************************************/
    
    if ( isset ( $_SERVER[ 'REDIRECT_QUERY_STRING' ] ) ) {
      $QueryString = $_SERVER[ 'REDIRECT_QUERY_STRING' ]; // The query looks like this: php%20echo%20writelink();%20?%3E 
    
       // Check if it is the wrong URL
      if ( preg_match( '|php%20echo%20writelink()|i', $QueryString ) ) {
      header("Location: http://www.mydomain.com/folder/parameter/");
      }
    }
       // Handle other errors
    ?>
    

    在这种特定情况下,我们利用字符串包含问号? 的事实,使其看起来像一个查询。所以我们尝试将查询内容与preg_match()匹配。

    应该这样做。如有必要,相应地修改链接,这只是一个示例。

    【讨论】:

    • (我在原始帖子中修复了一个错误。正如您推测的那样,返回的是 403,而不是 304 - 阅读障碍解开!:()我喜欢您的解决方案,不幸的是,它不起作用。 $QueryString 包含类似:param=parameter/
    • 好吧,看来重定向是有效的。我在答案中添加了一些调试代码,以帮助您修改脚本。似乎传入的查询字符串与问题中的字符串不同,因此应相应调整 preg_match() 函数或任何其他类似函数。
    • 忘了提及:从 .htaccess 文件中删除所有具有相同目的的规则。只保留 403 错误重定向。
    • 感谢您的帮助 - 我通过检查 REQUEST_URI 服务器值而不是 REDIRECT_QUERY_STRING 得到了它,它运行良好:)
    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 2018-06-21
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多