wordpress禁止搜索引擎抓取指定路径或者是动态路径页面

今天查询发现上午发布的一篇文章被收录了,但收录的地址却是动态的。

可以我的网站是伪静态的,所以就不想让它收录动态页面。robots里面加入了禁止抓取这些动态地址和某些路径,但是蜘蛛依然每天抓取,而且还收录了!所以只能强制禁止它访问。

把下列代码加入到服务器配置文件ROOT后面即可

#### 禁止搜索引擎访问指定文件夹或者路径 【开始】####
    #初始化变量为空
    set $deny_spider "";
    #如果请求地址中含有需要禁止抓取关键词时,将变量设置为y:
    if ($request_uri  ~* "\?replytocom=(\d+)|\?p=(\d+)|/feed|/date|/wp-admin|comment-page-(\d+)|/go") {
         set $deny_spider 'y';
    }
    #如果抓取的UA中含有spider或bot时,继续为变量赋值(通过累加赋值间接实现nginx的多重条件判断)
    if ($http_user_agent ~* "spider|bot") {
     set $deny_spider "${deny_spider}es";
    }
    #当满足以上2个条件时,则返回404,符合搜索引擎死链标准
     if ($deny_spider = 'yes') {
         return 403; #如果是删除已收录的,则可以返回404
         break;
     }
     #### 禁止搜索引擎访问指定文件夹或者路径【结束】 ####

然后测试一下,动态地址抓取失败,静态地址成功。

还有一种方法就是把代码直接写进当前主题页的functions.php里面即可。

PHP代码如下

/*禁止蜘蛛抓取指定路径代码*/
ob_start("Deny_Spider_Advanced");
function Deny_Spider_Advanced() {
    $UA = $_SERVER['HTTP_USER_AGENT'];
    $Request_uri = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
    $Spider_UA  = '/(spider|bot|)/i'; //定义需要禁止的蜘蛛UA,一般是spider和bot
    //禁止蜘蛛抓取的路径,可以参考自己的robots内容,每个关键词用分隔符隔开,需注意特殊字符的转义
    $Deny_path  = '/\?replytocom=(\d+)|\?p=(\d+)|\/feed|\/date|\/wp-admin|wp-includes|\/go|comment-page-(\d+)/i';
    //如果检测到UA为空,可能是采集行为
    if(!$UA) {
        header("Content-type: text/html; charset=utf-8");
        wp_die('请勿采集本站,因为采集的站长木有小JJ!');
    } else {
        //如果发现是蜘蛛,并且抓取路径匹配到了禁止抓取关键词则返回404或者403
        if(preg_match_all($Spider_UA,$UA) && preg_match_all($Deny_path,$Request_uri)) {
             //header('HTTP/1.1 404 Not Found');  
             //header("status: 404 Not Found");       
             header('HTTP/1.1 403 Forbidden'); 
             header("status: 403 Forbidden");             
        }
    }
}

写在最后,我在发布这个篇文章时,发现发布按钮是灰色不可用的。用控制台检查发现有错误:Failed to load resource: the server responded with a status of 403 ()

原来是上面规则中访问后台目录会出现403错误。把后台目录从上面规则里删除即可。

 

THE END