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

Эта статья является продолжением статьи «Скрипт управления содержимым файла robots.txt. Часть 1.». В прошлый раз, я остановился на том, что была подготовлена форма состоящая из чекбоксов, с помощью которой можно было выделить и отправить на удаление те строки файла с директивами «Disallow», которые уже не нужны. При этом все URL выводились в расшифрованном виде, что позволяет без проблем понимать содержимое даже закодированных кириллических адресов.

В этот раз, я постараюсь добавить функцию с помощью которой можно было бы легко добавлять новые записи (с директивой «Disallow») в файл, и если необходимо – кодировать эти строки через Urlencode().

Статья получилась несколько сумбурной, поэтому в ней я, в конечном счете, описал лишь основные блоки кода и в конце получившийся итоговый конечный код скрипта.

Форма для создания новой записи в файл Robots.txt.

Для начала подготовим форму для ввода и отправки URL, который нужно закрыть от индексации ПС.

<form action="urlencode.php" name="UrlEncode" method="post">
  <input type="checkbox" name="coding" value="no"><label style="color: #000; font-family:Arial, Helvetica, sans-serif; font-size: 14px;">Не кодировать строку.</label><br/>
  <input type="text" value="<?php if (isset($_POST['url'])) {echo $URL;} else {echo 'Введите сюда свой URL который необходимо закодировать.';}?>" name="url" size="100"/>
  <input type="submit" value="Закодировать и добавить строку в Robots.txt"/>
</form>
 

Форма будет отправлять данные методом post в тот же скрипт, в теле которого она находится. В ней уже предусмотрен чекбокс «не кодировать строку» - при выборе которого, кодирование строки происходить не будет, по умолчанию она кодируется. В само текстовое поле предусмотрел повторный вывод после отправки того, что было введено в него. Это может быть удобно, если понадобится что-то скорректировать (опечатку например) без необходимости набирать строку полностью заново.

Кодирование строки.

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

<?php if (isset($_POST['url'])) {
  $str = trim($_POST['url']);
  if (isset($_POST['coding']) and $_POST['coding'] == 'no'){
    $disallow_url = 'Disallow: '.$str;
  } else {
    $disallow_url = 'Disallow: '. urlencode($str);
  }
}?>
 
 
<form action="urlencode.php" name="UrlEncode" method="post">
  <input type="checkbox" name="coding" value="no"><label style="color: #000; font-family:Arial, Helvetica, sans-serif; font-size: 14px;">Не кодировать строку.</label><br/>
  <input type="text" value="<?php if (isset($_POST['url'])) {echo $URL;} else {echo 'Введите сюда свой URL который необходимо закодировать.';}?>" name="url" size="100"/>
  <input type="submit" value="Закодировать и добавить строку в Robots.txt"/>
</form>
 
 
<?php if (isset($_POST['url'])) {;?>
  <div style="width:900px;"><p style="font-family:'Lucida Console', Monaco, monospace; font-size: 14px;"><font style="color:#C00;">В Robots.txt добавлена строка:</font><br/><?php echo $disallow_url;?></p></div>
<?php }?>

Исполнение скрипта происходит только в том случае, если существует $_POST[‘url’], далее на всякий случай обрезаются пробелы в начале и конце строки с помощью trim(), и потом уже в зависимости от того прислана ли команда не кодировать, происходит формирование соответствующей строки для вставки в файл robots.txt.

Вставка новой записи в файл robots.txt.

Теперь необходимо новую запись вставить в файл robots.txt. Конечно, проще всего вставить ее в конец документа, но это будет не правильно, потому что в случае если записаны директивы «Host» и/или «Sitemap» – то новая строка будет стоять после них, что не есть правильно. Второй простой вариант, вставить новую строку сразу после директивы «User-agent» - но это как-то не красиво. Хочется новую строку вставить в конец списка с директивами «Disallow».

Для этого в код, который был получен в прошлой статье немного дополним – внутри цикла, в котором выводится форма с чекбоксами, вставим конструкцию с помощью которой мы сможем знать индекс последнего элемента с директивой «Disallow»:

if ($str[0] == 'Disallow'){
            $last_disallow = $key;
}

Также дополним форму отправки ссылки на добавление в robots.txt: создадим скрытое поле (type=«hidden»), с информацией об индексе поcледнего «Disallow»:

<form action="urlencode.php" name="UrlEncode" method="post">
  <input type="checkbox" name="coding" value="no"><label style="color: #000; font-family:Arial, Helvetica, sans-serif; font-size: 14px;">Не кодировать строку.</label><br/>
  <input type="text" value="<?php if (isset($_POST['url'])) {echo $URL;} else {echo 'Введите сюда свой URL который необходимо закодировать.';}?>" name="url" size="100"/>
 
  <input type="hidden" name="last_disallow" value="<?php echo $last_disallow; ?>"/>
 
  <input type="submit" value="Закодировать и добавить строку в Robots.txt"/>
</form>

Осталось подготовить и вставить код, который будет осуществлять запись новой строки в файл robots.txt.

$robots_f = array_merge(array_slice($robots,0,$_POST['last_disallow']+1),array($disallow_url),array_slice($robots,$_POST['last_disallow']+1));
$robots_write = fopen("$work_dir/robots.txt", "w");
$t = implode("\n",$robots_f);
fwrite($robots_write, $t);
fclose($robots_write);  
$robots = file("$work_dir/robots.txt",FILE_IGNORE_NEW_LINES);

Здесь массив полученный при импорте файла robots.txt делится на две части, с учетом номера последней директивы «Disallow», между этими двумя частями вставляется новое значение, массивы объединяются в один и уже полученный новый массив («склееный» в строку) записывается в файл, который предварительно обрезается до нулевой длины. В конце, файл robots.txt, для контроля, снова импортируется в массив $robots.

Исправление неточностей ввода URL.

Последний момент, который я посчитал важным - это исправление некоторых ошибок, которые могут возникнуть при вводе URL. Во-первых, при копировании URL откуда бы то ни было - могут быть скопированы пробелы в начале и в конце строки. Они убираются через trim(), который уже есть в коде. Вторая ошибка: пользователь может не указать в начале строки слэш «/». Это можно исправить проверкой регулярным выражением вводимой строки:

if (!preg_match('/^\/.*$/',$URL)){
  $URL = '/'.$URL;
}

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

if (!preg_match('/^.*\.[a-zA-Z0-9\/]{2,5}$/',$URL)){
  $URL = $URL.'/';
}

Посленяя ошибка, которая может возникнуть: иногда возникает искушение указать URL, как «http://www.moy-site.ru/nenadoindeksirovat.html». Это тоже проверяем регулярным выражением, и если подобная конструкция имеется - заменить ее на символ «/».

if (preg_match('/^http:\/\/[w]{0,3}\.[a-zA-Z0-9_]{1,30}\.[a-zA-Z0-9]{1,4}.*$/',$URL)){
  $URL = preg_replace ('http:\/\/[w]{3}\.[a-zA-Z0-9_]{1,30}\.[a-zA-Z0-9]{1,4}','/',$URL);
}

Окончательный итог.

В итоге, если совместить все наработки в этой статье с кодом из прошлой, в правильной последовательности то мы получаем уже рабочий код, который можно использовать:

<?php
  $work_dir = $_SERVER['DOCUMENT_ROOT'];
  $robots = file("$work_dir/robots.txt",FILE_IGNORE_NEW_LINES);
 
if (isset($_POST['url'])) {
  // исправление ошибок ввода URL
  $URL = trim($_POST['url']);
  if (preg_match('/^http:\/\/[w]{0,3}\.[a-zA-Z0-9_]{1,30}\.[a-zA-Z0-9]{1,4}.*$/',$URL)){
    $URL = preg_replace ('http:\/\/[w]{3}\.[a-zA-Z0-9_]{1,30}\.[a-zA-Z0-9]{1,4}','/',$URL);
  }
  if (!preg_match('/^\/.*$/',$URL)){
    $URL = '/'.$URL;
  }
  if (!preg_match('/^.*\.[a-zA-Z0-9\/]{2,5}$/',$URL)){
    $URL = $URL.'/';
  }
  // кодирование строки URL
  if (isset($_POST['coding']) and $_POST['coding'] == 'no'){
    $disallow_url = 'Disallow: '.$URL;
  } else {
    $disallow_url = 'Disallow: '.str_replace('-_-_-_','*',str_replace('----','/',urlencode(str_replace('/','----',str_replace('*','-_-_-_',$URL)))));
  }
 
  // добавление строки в robots.txt
  $robots_f = array_merge(array_slice($robots,0,$_POST['last_disallow']+1),array($disallow_url),array_slice($robots,$_POST['last_disallow']+1));
  $robots_write = fopen("$work_dir/robots.txt", "w");
  $t = implode("\n",$robots_f);
  fwrite($robots_write, $t);
  fclose($robots_write);  
  $robots = file("$work_dir/robots.txt",FILE_IGNORE_NEW_LINES);
}
  // удаление строки из robots.txt
  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/>";
      // здесь позиция последнего disallow. После этого него - будт вставлена новая строка.
      if ($str[0] == 'Disallow'){
        $last_disallow = $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];
      }    
  }
  $checkbox_form .= "</div>";
  $checkbox_form .= "<input type=\"submit\" value=\"Удалить указанные строки из Robots.txt\"/>";
  $checkbox_form .= "</form>";
?>
<!--форма отправки URL на запись в файл robots.txt-->
<form action="urlencode.php" name="UrlEncode" method="post">
  <input type="checkbox" name="coding" value="no"><label style="color: #000; font-family:Arial, Helvetica, sans-serif; font-size: 14px;">Не кодировать строку.</label><br/>
  <input type="text" value="<?php if (isset($_POST['url'])) {echo $URL;} else {echo 'Введите сюда свой URL который необходимо закодировать.';}?>" name="url" size="100"/>
  <input type="hidden" name="last_disallow" value="<?php echo $last_disallow; ?>"/>
  <input type="submit" value="Закодировать и добавить строку в Robots.txt"/>
</form>
<?php if (isset($_POST['url'])) {;?>
  <div style="width:900px;"><p style="font-family:'Lucida Console', Monaco, monospace; font-size: 14px;"><font style="color:#C00;">В Robots.txt добавлена строка:</font><br/><?php echo $disallow_url;?></p></div>
<?php }?>
 
<?php
 
  // вывод формы с чекбоксами
  echo $checkbox_form;
?>

Примерно такую форму мы можем получить в результате исполнения скрипта. Осталось ее только оформить для красоты и удобства - но это уже кому как нравится и на свое усмотрение.

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

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


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

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