.htaccess:阻止来自我自己域名的虚假引用者

时间:2013-12-05 14:57:50

标签: regex apache .htaccess mod-rewrite

使用.htaccess我遇到了一个棘手的问题。我的网站上有大量的机器人占用带宽,这些机器人正在展示看似来自我网站的虚假参与者。我用Google搜索并在这里查看,但看不到任何阻止它的方法(这可能就是为什么他们这样做了!)

例如,一个机器人发送referer domain.com/accessories/fake_file1,而另一个机器人发送虚假的referer domain.com/bikes/fake_file2。

我知道.htaccess可以用来阻止引用,但我发现的所有文档都表明你只能在每个域的基础上阻止我真的不愿意把我自己的域名作为域名阻止因为我确定会搞砸一些东西!

有没有办法做这样的事情:

RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} mydomain\.com\/fake_dir1/ [NC]
RewriteCond %{HTTP_REFERER} mydomain\.com\/fake_dir2/ [NC]
RewriteCond %{HTTP_REFERER} mydomain\.com\/fake_dir3/ [NC]
RewriteRule .* - [F]

提前致谢!

1 个答案:

答案 0 :(得分:2)

您需要将[OR]条款设为:

RewriteEngine on

RewriteCond %{HTTP_REFERER} mydomain\.com/fake_dir1/ [NC,OR]
RewriteCond %{HTTP_REFERER} mydomain\.com/fake_dir2/ [NC,OR]
RewriteCond %{HTTP_REFERER} mydomain\.com/fake_dir3/ [NC]
RewriteRule ^ - [F]

或者更好的正则表达式:

RewriteCond %{HTTP_REFERER} mydomain\.com/(fake_dir1|fake_dir2|fake_dir3)/ [NC]
RewriteRule ^ - [F]

更新

  1. 为了测试这个规则,我创建了这个PHP代码:

    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "localhost/go/1z67");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_REFERER, 'mydomain.com/accessories/water-bottles-and-cages/…');
    $html = curl_exec($ch);
    curl_close($ch);  
    var_dump($html);
    ?> 
    
  2. DOCUMENT_ROOT/.htaccess文件中的此规则:

    RewriteEngine on
    
    RewriteCond %{HTTP_REFERER} mydomain\.com/accessories/ [NC]
    RewriteRule ^ - [F]
    
  3. 然后当我运行那个卷曲脚本时,我得到了这个:

    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>403 Forbidden</title>
    </head><body>
    <h1>Forbidden</h1>
    <p>You don't have permission to access /go/1z67
    on this server.</p>
    </body></html>