在htaccess文件中使用rewriterule选择特殊字符

时间:2013-01-27 02:18:45

标签: .htaccess mod-rewrite special-characters

我犯了一个小错误(我在现有的php调用中启动了一个新的php调用 - oops)并设法让google开始抓取一堆看起来像这样的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 ^文件夹/(.*)/$/content/element.php?param=$1 [L] )

我之前在路径上有%年龄问题,但这次我决定打败它 - 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您的网址是这样的:

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

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

由于初始字符< (%3C),错误应为403(禁止)。

这些错误使得.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()匹配。

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