Блог Веб-разработчика.

Необходимость создания такого скрипта, опять же, возникла  в связи с особенностями одного из сайтов заказчика. На сайте стоит компонент ЧПУ (SEF) который генерирует человеко-понятные ссылки на кириллице. Кириллические ссылки на сайте имеют свои плюсы, минусы – на этом заострять свое внимание не будем.

Однако, когда сайт существует  давно, и на нем происходит какая-то динамика с материалами, товарами – рано или поздно случается необходимость какую-то страницу закрыть от индексации, или удалить ее из поискового индекса в связи с ее исчезновением. Тут приходит на помощь файл robots.txt. Мы можем туда записывать все адреса страниц сайта, которые необходимо запретить к индексации поисковыми системами (ПС).

Но, тут могут возникнуть две небольшие проблемы.

Первая: если Вы введете в файл строку, включающую адрес с кириллицей – то, например, «яндекс вебмастер» может ругнуться, что в этой строке «ошибка синтаксиса:  возможно был использован недопустимый символ». И здесь ошибка даже не в кодировке файла «robots.txt», а в наличии именно кириллицы. Чтобы эта ошибка не возникала необходимо строку адреса «пропустить» через php-функцию

Urlencode()

Тогда запись типа:

Disallow: /страница-которую-не-надо-индексировать.html

Примет вид в закодированном виде:

Disallow: /%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%83%D1%8E-%D0%BD%D0%B5-%D0%BD%D0%B0%D0%B4%D0%BE-%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C.html

Замечательно! «Яндекс вебмастер» ругаться перестал, это очень хорошо. Но тут приходит наше время ругаться. Представьте, что Вам нужно изменить содержимое файла robots.txt, какую-то запись скорректировать или вовсе удалить, а у Вас там есть такое:

Disallow: /%D0%92%D0%B8%D0%BA%D0%B8%D0%BD%D0%B3/
Disallow: /%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BF%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D0%BA%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%9B%D0%B5%D0%BE%D0%BD%D0%B0-%D0%94%D0%B5%D0%B9%D0%B1%D0%B5%D0%B4-%D0%A4%D1%80%D0%B5%D0%B4%D0%BE/
Disallow: /%D0%A1%D0%B5%D1%80%D0%B8%D1%8F/View-all-products.html
Disallow: /%D0%94%D0%B2%D1%83%D1%85%D1%8A%D1%8F%D1%80%D1%83%D1%81%D0%BD%D1%8B%D0%B5-%D0%BA%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%B8-%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8-260-%D0%A3%D0%B2%D0%B5-%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8-265/
Disallow: /%D0%9C%D0%B5%D0%B1%D0%B5%D0%BB%D1%8C-%D0%92%D0%B8%D0%BA%D0%B8%D0%BD%D0%B3/
Disallow: /%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BF%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BA%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%B8.html
Disallow: /%C3%90%C2%94%C3%90%C2%B2%C3%91%C2%83%C3%91%C2%81%C3%90%C2%BF%C3%90%C2%B0%C3%90%C2%BB%C3%91%C2%8C%C3%90%C2%BD%C3%91%C2%8B%C3%90%C2%B5-%C3%90%C2%BA%C3%91%C2%80%C3%90%C2%BE%C3%90%C2%B2%C3%90%C2%B0%C3%91%C2%82%C3%90%C2%B8-%C3%90%C2%A1%C3%90%C2%B0%C3%90%C2%BD%C3%91%C2%82%C3%90%C2%B8%C3%90%C2%BD%C3%90%C2%BE-%C3%90%C2%9B%C3%90%C2%B5%C3%90%C2%BE%C3%90%C2%BD%C3%90%C2%B0-%C3%90%C2%A4%C3%91%C2%80%C3%90%C2%B5%C3%90%C2%B4%C3%90%C2%BE/
Disallow: /%C3%90%C2%9E%C3%90%C2%B4%C3%90%C2%BD%C3%90%C2%BE%C3%91%C2%81%C3%90%C2%BF%C3%90%C2%B0%C3%90%C2%BB%C3%91%C2%8C%C3%90%C2%BD%C3%90%C2%B0%C3%91%C2%8F-%C3%90%C2%BA%C3%91%C2%80%C3%90%C2%BE%C3%90%C2%B2%C3%90%C2%B0%C3%91%C2%82%C3%91%C2%8C-%C3%90%C2%9B%C3%90%C2%B5%C3%90%C2%BE%C3%90%C2%BD%C3%90%C2%B0-%C3%90%C2%94%C3%90%C2%B5%C3%90%C2%B9%C3%90%C2%B1%C3%90%C2%B5%C3%90%C2%B4-%C3%90%C2%A4%C3%91%C2%80%C3%90%C2%B5%C3%90%C2%B4%C3%90%C2%BE/
Disallow: /%D1%82%D1%83%D0%BC%D0%B1%D1%8B/
Disallow: /%D0%9D%D0%B0%D1%88%D0%B8-%D0%BF%D0%BB%D1%8E%D1%81%D1%8B-%D0%B8-%D0%BC%D0%B8%D0%BD%D1%83%D1%81%D1%8B.html
Disallow: /%D0%9D%D0%B0%D1%88%D0%B8-%D0%BF%D0%BB%D1%8E%D1%81%D1%8B-%D0%B8-%D0%BC%D0%B8%D0%BD%D1%83%D1%81%D1%8B/feed/atom.html
Disallow: /%D0%9F%D1%80%D0%B0%D0%B9%D1%81.html
Disallow: /%D0%A1%D0%BF%D0%B0%D0%BB%D1%8C%D0%BD%D1%8F-%D0%91%D0%BE%D1%81%D0%B5%D0%BD/*
Disallow: /%D0%A2%D1%83%D0%BC%D0%B1%D1%8B/
Disallow: /%D0%94%D0%B2%D1%83%D1%81%D0%BF%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BA%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D0%B8-%D0%A1%D0%B0%D0%BD%D1%82%D0%B8%D0%BD%D0%BE-%D0%9B%D0%B5%D0%BE%D0%BD%D0%B0-%D0%A4%D1%80%D0%B5%D0%B4%D0%BE/

Яндекс-то (или любая другая ПС) все хорошо читает, но Вот нам, простым смертным, читать это совершенно не удобно и приходится идти на извращения, чтобы понять какая запись – что означает.

Именно эти две проблемы заставили поставить задачу написания некоего скрипта, с помощью которого можно было бы легко управлять содержимым файла robots. Чтобы с одной стороны, можно было при необходимости закодировать добавляемую строку, а сдругой – чтобы мы могли без проблем читать этот файл и понимать его содержимое. Вот разработкой такого скрипта и займемся.

Вывод содержимого.

Для начала научимся выводить то, что есть в файле. Учитывая, что файл скрипта не обязательно будет находиться в одной директории с файлом robots.txt воспользуемся фукнцией $_SEREVER для определения корня файловой системы и подгрузим файл в виде массива через file():

$work_dir = $_SERVER['DOCUMENT_ROOT'];
$robots = file("$work_dir/robots.txt",FILE_IGNORE_NEW_LINES);

Далее попробуем вывести содержимое, однако помним, что у нас могут быть закодированные строки с кириллическими адресами, поэтому предварительно пропустим их через urldecode(). Для этого мы сначала каждую строку разобьем на массив через explode() по символу «: » (двоеточие с пробелом), вторым элементом такого массива будет именно адрес, запрещенный к индексации. И имено его мы сначала раскодируем и после сформируем новую строку, которую и выведем на монитор. При этом нужно заметить, что преобразуются только кириллические строки, латиница остается без изменений.

$robots_text = array();
 foreach ($robots as $key=>$val) {
             $str = explode(": ",$val);
             $robots_text[$key]= $str[0].": ".urldecode($str[1])."<br/>";
             echo $robots_text[$key];
 }

Если оригинальный файл robots у нас выглядит так:

User-agent: *
Disallow: /administrator/
Disallow: /cache/
Disallow: /cli/
Disallow: /components/
Disallow: /images/
Disallow: /includes/
Disallow: /installation/
Disallow: /language/
Disallow: /libraries/
Disallow: /logs/
Disallow: /media/
Disallow: /modules/
Disallow: /plugins/
Disallow: /templates/
Disallow: /tmp/
Disallow: /%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0-%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%89%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F+%D0%BA+%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8.html
Disallow: /%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D1%8F-%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%89%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F+%D0%BA+%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D1%86%D0%B8%D0%B8/
Disallow: /%D0%BD%D0%B5%D0%BD%D0%B0%D0%B4%D0%BE%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C.html
Sitemap: http://www.webengineer.pro/sitemap.xml
Host: www.webengineer.pro

то обратившись к скрипту, мы получим в браузере такой результат:

User-agent: *
Disallow: /administrator/
Disallow: /cache/
Disallow: /cli/
Disallow: /components/
Disallow: /images/
Disallow: /includes/
Disallow: /installation/
Disallow: /language/
Disallow: /libraries/
Disallow: /logs/
Disallow: /media/
Disallow: /modules/
Disallow: /plugins/
Disallow: /templates/
Disallow: /tmp/
Disallow: /ссылка-запрещенная к индексации.html
Disallow: /директория-запрещенная к индексации/
Disallow: /ненадоиндексировать.html
Sitemap: http://www.webengineer.pro/sitemap.xml
Host: www.webengineer.pro

Преобразование списка в форму.

Наша конечная задача – научиться управлять содержимым. Например, удалять те строки, которые уже для нас не актуальны. Для этого, я выведенный список файлов преобразую в форму с чекбоксами.

$checkbox_form = "<form action=\"urlencode.php\" name=\"UrlEncode\" method=\"post\">";
$checkbox_form .= "<div style=\"font-family: 'Courier New', Courier, monospace;\">";
$robots_text = array();
foreach ($robots as $key=>$val) {
  $str = explode(": ",$val);
  $robots_text[$key]= $str[0].": ".urldecode($str[1])."<br/>";
  $checkbox_form .= "<input type=\"checkbox\" name=\"row_del[]\" value=\"".$key."\">".$robots_text[$key];
}
$checkbox_form .= "</div>";
$checkbox_form .= "<input type=\"submit\" value=\"Удалить указанные строки из Robots.txt\"/>";
$checkbox_form .= "</form>";
echo $checkbox_form;
 

добавил вывод соответствующих тегов, сразу немного оформил, добавил уже кнопку отправки данных, хотя пока форма ничего удалять не будет – так как нет соотвествующиего кода. Все выделеные значение будут помещаться в массив $row_del. Форма отправляет данные в тот же файл, в котором находится сама.

В принципе уже хорошо, но есть один недостаток. В файле robots есть директивы: User-agent, Host, Sitemap – строки с этими директивами тоже оказались помечеными чекбоксами. Это не очень хорошо, потому что в будущем тогда можно по невнимательности нечайно удалить эти строки, что нам совсем не нужно. Поэтому позаботимся заранее, чтобы эти строки выделялись отключенными (disabled) чекбоксами. Для этого в цикл вывода добавим несложную проверку функцией «if». Проверять будем первый элемент массива, полученного из каждой строки записи, если он будет соответствовать одной из вышеперечисленных директив – тогда выводим неактивный чекбокс:

То есть вместо:

$checkbox_form .= "<input type=\"checkbox\" name=\"row_del[]\" value=\"".$key."\">".$robots_text[$key];

вписываем:

if (preg_match("/^(User\-agent|Host|Sitemap)$/",$str[0])){
    $checkbox_form .= "<input type=\"checkbox\" name=\"row_del[]\" value=\"".$key."\" disabled=\"disabled\">".$robots_text[$key];
} else{
    $checkbox_form .= "<input type=\"checkbox\" name=\"row_del[]\" value=\"".$key."\">".$robots_text[$key];
}

в результате, при обращении к скрипту, в браузере получим что-то вроде этого:

Удаление выбранных записей

Форма готова. Теперь мы можем добавить код, который будет осуществлять удаление выбранных в форме строк. Для этого перед выводом формы, вставим код, который будет запускаться только в случае получения массива $_POST[‘row_del ‘]. Этот массив содержит ключи массива $robots, который получен при импорте файла robots.txt. Все элементы массива $robots, соответствующие этим ключам, в цикле уничтожаются и новый массив записывается в файл robots.txt, который предварительно обрезается до нулевой длины. Затем обновленный файл снова импортируется в массив $robots для того, чтобы была возможность вывести на монитор форму с чекбоксами, соответствующую обновленному файлу.

if(isset($_POST["row_del"])){
  $row_del = $_POST["row_del"];
  foreach ($row_del as $value){
    unset($robots[$value]);      
  }
  $robots_write = fopen("robots.txt", "w");
  $t = implode("\n",$robots);
  fwrite($robots_write, $t);
  fclose($robots_write);
  $robots = file("$work_dir/robots.txt",FILE_IGNORE_NEW_LINES);
}

Теперь при отправке из формы выбранных строк, они будут удалены из файла, при этом сама таблица формы тоже обновится в соответсвии с новым содержимым.

Итоговый код

$work_dir = $_SERVER['DOCUMENT_ROOT'];
$robots = file("$work_dir/robots.txt",FILE_IGNORE_NEW_LINES);
 
 
if(isset($_POST["row_del"])){
  $row_del = $_POST["row_del"];
  foreach ($row_del as $value){
    unset($robots[$value]);      
  }
  $robots_write = fopen("robots.txt", "w");
  $t = implode("\n",$robots);
  fwrite($robots_write, $t);
  fclose($robots_write);
  $robots = file("$work_dir/robots.txt",FILE_IGNORE_NEW_LINES);
}
 
 
$checkbox_form = "<form action=\"urlencode.php\" name=\"UrlEncode\" method=\"post\">";
$checkbox_form .= "<div style=\"font-family: 'Courier New', Courier, monospace;\">";
$robots_text = array();
foreach ($robots as $key=>$val) {
  $str = explode(": ",$val);
  $robots_text[$key]= $str[0].": ".urldecode($str[1])."<br/>";
 
  if (preg_match("/^(User\-agent|Host|Sitemap)$/",$str[0])){
      $checkbox_form .= "<input type=\"checkbox\" name=\"row_del[]\" value=\"".$key."\" disabled=\"disabled\">".$robots_text[$key];
  } else{
      $checkbox_form .= "<input type=\"checkbox\" name=\"row_del[]\" value=\"".$key."\">".$robots_text[$key];
  }
 
}
$checkbox_form .= "</div>";
$checkbox_form .= "<input type=\"submit\" value=\"Удалить указанные строки из Robots.txt\"/>";
$checkbox_form .= "</form>";
echo $checkbox_form;

Итак, мы получили промежуточный результат. Мы научились через форму удалять ненужные строки из файла robots.txt. По хорошему, нужно эту форму еще оформить так, чтобы она приятно смотрелась и было приятно работать. Но это уже каждый делает на свой вкус.

В следующей статье, я доработаю скрипт так, чтобы была возможность добавлять новые записи в файл robots с учетом того, что может потребоваться кодирование строки содержащей кириллицу.

Если информация этой статьи будет интересна и полезна Вашему кругу друзей и знакомых, то Вы можете опубликовать ссылку - тогда им проще будет ее найти. Они Вам будут благодарны:).

Комментарии к статье:


Всеволод Чупрыгин © webengineer.pro 2014. Все права защищены.
Копирование материалов сайта разрешено только с указанием имени автора (Всеволод Чупрыгин) и прямой индексируемой ссылки на источник на сайте www.WebEngineer.pro.
ИП Чупрыгин Всеволод Андреевич, ИНН: 333410747832, ОГРН: 311333426300044
http://vkontakte.ru/chuprygin_va, Google +

.
Проверить аттестат
Мы принимаем Webmoney Мы принимаем практически все платежи через Robokassa Мы принимаем Яндекс.Деньги Мы принимаем платежи через QIWI. Мы принимаем платежи через привязанные к QIWI карты VISA/Mastercard.