Скрипт управления содержимым файла robots.txt. Часть 1.
Опубликовано: 29 Май 2013
Необходимость создания такого скрипта, опять же, возникла в связи с особенностями одного из сайтов заказчика. На сайте стоит компонент ЧПУ (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 с учетом того, что может потребоваться кодирование строки содержащей кириллицу.
Если информация этой статьи будет интересна и полезна Вашему кругу друзей и знакомых, то Вы можете опубликовать ссылку - тогда им проще будет ее найти. Они Вам будут благодарны:).