Обработка директив файла robots.txt с помощью php

Количество просмотров: 770

Недавно столкнулся с задачей добавить на страницы закрытые от индексации в файле robots.txt мета тег <meta name="googlebot" content="noindex">, дабы они не появлялись в поиске большого брата. С одной стороны вроде простая задача, создай кастомное поле да заполни его у тех страниц где нужно разместить. Однако, у данного подхода несколько недостатков, 1 - файл robots.txt может измениться и придется еще раз вносить изменения в базу, 2 - нет возможности добавить поле для страниц с get параметрами. Т.е. например /catalog/tovar - доступна, а catalog/tovar?param=3 уже нет. В итоге было принято решение написать простой обработчик файла robots.txt для автоматического добавления данного метатега на страницу.

В итоге получился такой код:


$str=file('/robots.txt'); //указываем путь к файлу и читаем из него в массив
$path=$_SERVER['REQUEST_URI']; // получаем урл текущей страницы

for($i=0;$i<count($str);$i++){ //прогоняем через цикл массив с директивами
	$sub=trim(preg_replace('~Disallow:~','',$str[$i])); //обрезаем лишние пробелы и Disallow:
	$sub=preg_replace('~\*~','.+',$sub); //заменяем звездочку на нужное нам любое количество символов
	echo '~'.$sub.'~<br>';
	if(preg_match('~'.$sub.'~',$path)){ // ищем совпадение, если совпадение есть то выводим мета тег
		echo 'есть мета тег';
		
		die();
	}
	
}

Для проверки данного скрипта был создан тестовый файл robots.txt со следующими директивами:

Disallow: /club/
Disallow: /*/search/
Disallow: /*PAGE_NAME=search
Disallow: /*&print=
Disallow: /*backurl=*
Disallow: /*BACKURL=*
Disallow: /*back_url=*
Disallow: /*?do=
Disallow: /korzina/
Disallow: *test$

Скриншоты с результатами проверки для нескольких урлов:

По результатам данной проверки можно сказать, что этот кусок кода делает, то, что нужно. Однако, мы не использовали директивы Allow, которая разрешает сканирование разделов если индексация вышестоящего раздела запрещена.

Например:


Disallow: /club/
Allow: /club/log

Добавив данные директивы в фалй и запустив проверку скрипта мы увидим, что /club/ и /club/log/ одинаково заблокированы, а нам так не нужно. Добавим обработку директив Allow: в наш скрипт.


<?php
$str=file('./robots.txt'); //указываем путь к файлу и читаем из него в массив
$path=$_SERVER['REQUEST_URI']; // получаем урл текущей страницы
$show=true; // переключатели
$show2=false;

for($i=0;$i<count($str);$i++){ //прогоняем через цикл массив с директивами
	$sub=trim(preg_replace('~Allow:~','',$str[$i])); //обрезаем лишние пробелы и Allow:
	$sub=preg_replace('~\*~','.+',$sub); //заменяем звездочку на нужное нам любое количество символов
	if(preg_match('~'.$sub.'~',$path)){ // ищем совпадение, если совпадение есть то меняем значение переключателя
		//echo 'разрешен';
		$show=false;
	}
	unset($sub);
}
for($i=0;$i<count($str);$i++){ //прогоняем через цикл массив с директивами
	$sub=trim(preg_replace('~Disallow:~','',$str[$i])); //обрезаем лишние пробелы и Disallow:
	$sub=preg_replace('~\*~','.+',$sub); //заменяем звездочку на нужное нам любое количество символов
	if(preg_match('~'.$sub.'~',$path)){ // ищем совпадение, если есть то переключаем
		//echo 'запрещен';
		$show2=true;
		
	}
	
}
if($show===$show2){ 
	echo 'Запрещен!'; //выведем мета тег
} 

else {
	echo "Разрешен!"; // урл разрешен, выводить мета тег не будем
}

Конечно, это далеко не самое элегантное, красивое и простое решение, но оно работает, и делает то, что от него требуется. В любом случае при желании можно переписать это десятками разных способов.

Важно! Если вы решите использовать данный код на своем сайте, крайне рекомендую проверить его работу в зависимости от своего файла robots.txt, для удобства сравнения корректности работы можно использовать сервис от Яндекса, в своем случае были проверены все директивы и работа скрипта была корректной, однако содержимое файла роботса было не самым сложным. Успехов!


comments powered by HyperComments

© 2015-2018 Goodweb.me --- Карта сайта --- info@goodweb.me

Наверх