Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex .htaccess:阻止来自我自己域的假引用_Regex_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Regex .htaccess:阻止来自我自己域的假引用

Regex .htaccess:阻止来自我自己域的假引用,regex,apache,.htaccess,mod-rewrite,Regex,Apache,.htaccess,Mod Rewrite,我在使用.htaccess时遇到了一个棘手的问题。我有一大堆机器人在我的网站上消耗带宽,这些机器人呈现的是来自我网站的虚假推荐。我在谷歌上搜索过,也在这里查看过,但看不到任何方法可以阻止这一切(这可能就是他们这么做的原因!) 例如,一个机器人发送referer domain.com/accessories/fake_file1,而另一个机器人发送fake referer domain.com/bikes/fake_file2 我知道.htaccess可以通过referer进行阻止,但我发现的所有

我在使用.htaccess时遇到了一个棘手的问题。我有一大堆机器人在我的网站上消耗带宽,这些机器人呈现的是来自我网站的虚假推荐。我在谷歌上搜索过,也在这里查看过,但看不到任何方法可以阻止这一切(这可能就是他们这么做的原因!)

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

我知道.htaccess可以通过referer进行阻止,但我发现的所有文档都表明,您只能在每个域的基础上进行阻止,我真的不愿意将我自己的域名作为要阻止的域,因为我确信这会搞砸一些事情

有没有办法做到这一点:

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]

提前谢谢

您需要将
[或]
条款作为:

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]
更新:
  • 为了测试此规则,我创建了以下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);
    ?> 
    
  • 然后当我运行curl脚本时,我得到了:

    <!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>
    
    
    403禁止
    被禁止的
    您没有访问/转到/1z67的权限
    在这个服务器上


    感谢您的回复-我突然想到,url实际上是这样的:mydomain\.com/fake\u dir1/file\u 1&mydomain\.com/fake\u dir1/file\u 2。如果我加上,正则表达式对那些人不起作用。但它应该起作用吗?e、 g.mydomain\.com/fake_dir1/*?当然这不是问题,你可以在
    [或]
    条件下的每一行使用具有不同URL的规则的第一种形式。是的,你可以使用
    RewriteCond%{HTTP\u REFERER}mydomain\.com/fake_dir1/
    来捕获所有这些情况。我已将此添加到我的.htaccess[code]RewriteCond%{HTTP_REFERER}domain\.com/accessories/*[NC,或]但是,如果我使用包含curl的php脚本访问我的站点上的url,并且referer设置为'domain.com/accessories/shimano-fishing-rod',则不会被阻止-页面仍然显示。如果您提供curl命令,那么我也可以从我的一端测试它,并相应地编辑答案。
    <!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>