Статьи

URL-адреса, удобные для поисковых систем

В современном Интернете очень популярны управляемые базой данных или динамические сайты. К сожалению, самый простой способ передачи информации между вашими страницами — это строка запроса. Если вы не знаете, что такое строка запроса, это строка информации, прикрепленная к концу URL-адреса после знака вопроса.

Так в чем же проблема? Ну, большинство поисковых систем (за некоторыми исключениями, а именно Google) не будут индексировать страницы, на которых есть знак вопроса или другой символ (например, знак амперсанда или знак равенства) в URL. Таким образом, все эти популярные динамические сайты не индексируются — и что хорошего в этом, если никто не может его найти?

Решение? Поисковые дружественные URL. Существует несколько популярных способов передачи информации на ваши страницы без использования строки запроса, поэтому поисковые системы будут индексировать эти отдельные страницы. Я рассмотрю 3 из этих методов в этой статье. Все 3 работают на PHP с Apache на Linux (и хотя они могут работать в других сценариях, я не могу подтвердить, что они работают).

Метод 1: PATH_INFO

Реализация:

Если вы посмотрите выше этой статьи в адресной строке, вы увидите URL-адрес, подобный следующему: http://www.webmasterbase.com/article.php/999/12. SitePoint фактически использует метод PATH_INFO для создания своих динамических страниц.

В Apache есть функция «оглядываться назад», которая сканирует URL-адрес в обратном направлении, если не находит того, что ищет. В этом случае нет каталога или файла с именем «12», поэтому он ищет «999». Но он обнаружил, что нет ни каталога, ни файла с именем «999», поэтому Apache продолжает просматривать URL-адрес и видит «article.php». Этот файл существует, поэтому Apache вызывает этот скрипт. Apache также имеет глобальную переменную с именем $PATH_INFO которая создается при каждом HTTP-запросе. Эта переменная содержит вызываемый скрипт и все, что справа от этой информации в URL. Таким образом, в примере, который мы использовали, $PATH_INFO будет содержать article.php/999/12 .

Итак, вы задаетесь вопросом, как я могу запросить мою базу данных, используя article.php/999/12 ? Сначала вы должны разделить это на переменные, которые вы можете использовать. И вы можете сделать это с помощью функции explode PHP:

 $var_array = explode("/",$PATH_INFO); 

Как только вы это сделаете, у вас будет следующая информация:

 $var_array[0] = "article.php" 
 $var_array[1] = 999 
 $var_array[2] = 12 

Таким образом, вы можете rename $var_array[1] в $article и $var_array[2] в $page_num и $page_num запрос к вашей базе данных.

недостаток:

Ранее у этого метода был один существенный недостаток. Google и, возможно, другие поисковые системы не будут индексировать страницы, созданные таким образом, так как они интерпретируют URL как искаженный. Я связался с разработчиком программного обеспечения в Google и сообщил им о проблеме, и я рад сообщить, что теперь она устранена.

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

Способ 2: страницы ошибок .htaccess

Реализация:

Второй метод предполагает использование файла .htaccess. Если вы новичок в этом, .htaccess — это файл, используемый для администрирования параметров доступа Apache для любого каталога, в котором вы его размещаете. Администратор сервера имеет лучший способ сделать это, используя свои файлы конфигурации, но, поскольку большинство из нас не У нас нет собственного сервера, мы не можем контролировать то, что делает администратор сервера. Теперь администратор сервера может настроить то, что пользователи могут делать со своим файлом .htaccess, поэтому этот подход может не работать на вашем конкретном сервере, однако в большинстве случаев так и будет. Если это не так, вам следует обратиться к администратору сервера.

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

 ErrorDocument 404 /processor.php 

Теперь создайте скрипт с именем processor.php и поместите его в тот же каталог, и все готово! Допустим, у вас есть следующий URL: http://www.domain.com/directory/999/12/. И снова в этом примере «999» и «12» не существуют, однако, поскольку вы нигде не указываете скрипт в пути к каталогу, Apache создаст ошибку 404. Вместо того, чтобы отправлять общий заголовок 404 обратно в браузер, Apache видит команду ErrorDocument в файле .htaccess и вызывает processor.php.

Теперь, в первом примере мы использовали переменную $PATH_INFO , но на этот раз это не сработает. Вместо этого нам нужно использовать переменную $REQUEST_URI , которая содержит все в URL после домена. Так что в этом случае он содержит: / directory / 999/12 /.

Первое, что вам нужно сделать в файле processor.php — это отправить новый заголовок HTTP. Помните, Apache думал, что это ошибка 404, поэтому он хочет сообщить браузеру, что не может найти страницу.

Итак, поместите следующую строку в ваш processor.php:

 header("HTTP/1.1 200 OK"); 

В этот раз мне нужно указать на важный факт. В первом примере вы можете указать, какой скрипт обрабатывает ваш URL. В этом примере все URL-адреса должны обрабатываться одним и тем же сценарием processor.php, который немного отличается. Вместо создания разных URL-адресов в зависимости от того, что вы хотите сделать, например article.php / 999/12 или printarticle.php / 999/12, у вас есть только 1 скрипт, который должен выполнять оба варианта.

Таким образом, вы должны решить, что делать, основываясь на информации, которую получает process.php — точнее, посчитав, сколько параметров передано. Например, на своем сайте я использую этот метод для создания своих страниц: я знаю, что если есть только один параметр, такой как http://www.online-literature.com/shakespeare/, то мне нужно загрузить страницу с информацией об авторе ; если есть 2 параметра, например http://www.online-literature.com/shakespeare/hamlet/, я знаю, что мне нужно загрузить страницу с информацией о книге; и, наконец, если есть 3 параметра, таких как http://www.online-literature.com/shakespeare/hamlet/3/, я знаю, что мне нужно загрузить страницу просмотра главы. Кроме того, вы можете просто использовать первый параметр, чтобы указать тип отображаемой страницы, а затем обработать оставшиеся параметры на основе этого.

Есть 2 способа выполнить эту задачу подсчета параметров. Сначала вам нужно использовать функцию $REQUEST_URI PHP, чтобы разделить переменную $REQUEST_URI . Так что если $REQUEST_URI = /shakespeare/hamlet/3/ :

 $var_array = explode("/",$REQUEST_URI); 

Теперь обратите внимание, что из-за расположения / ‘в этом массиве фактически есть 5 элементов. Первый элемент, элемент 0, пуст, потому что он содержит информацию перед первым /. Пятый элемент, элемент 4, также является пустым, поскольку он содержит информацию после последнего /.

Итак, теперь нам нужно посчитать элементы в нашем $var_array . PHP имеет две функции, которые позволяют нам делать это. Мы можем использовать функцию sizeof() как в этом примере:

 $num = sizeof($var_array); // 5 

Вы заметите, что функция sizeof() считает каждый элемент в массиве независимо от того, является ли он пустым. Другая функция — count() , которая является псевдонимом для функции sizeof() .

Некоторые поисковые системы, такие как AOL, автоматически удаляют завершающий / из вашего URL, и это может вызвать проблемы, если вы используете эти функции для подсчета массива. Например, http://www.online-literature.com/shakespeare/hamlet/ становится http://www.online-literature.com/shakespeare/hamlet, и поскольку в этом массиве всего 3 элемента, наш процессор.php будет загрузить страницу автора вместо страницы книги.

Решение состоит в том, чтобы создать функцию, которая будет считать только элементы в массиве, которые фактически содержат данные. Это позволит вам исключить окончание / или разрешить любые ссылки из поисковой системы AOL указывать на правильное место. Примером такой функции является:

 function count_all($arg)  {  // skip if argument is empty  if ($arg) {    // not an array, return 1 (base case)    if(!is_array($arg))    return 1;    // else call recursively for all elements $arg    foreach($arg as $key => $val)    $count += count_all($val);    return $count;  }  } 

Чтобы получить ваш счет, доступ к функции, как это:

 $num = count_all($url_array); 

Как только вы знаете, сколько параметров вам нужно, вы можете определить их следующим образом:

 $author=$var_array[1]; 
$book=$var_array[2];
$chapter=$var_array[3];

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

недостаток:

Недостаток этого метода заключается в том, что каждая страница, на которую попала страница, рассматривается Apache как ошибка. Таким образом, каждое попадание создает еще одну запись в журнале ошибок вашего сервера, которая эффективно разрушает их полезность. Поэтому, если вы используете этот метод, вы жертвуете своими журналами ошибок.

Метод 3: Директива ForceType

Реализация:

Вы помните, что при использовании метода PATH_INFO вещь, которая отключает Google и, возможно, даже другие поисковые системы, это период в середине URL. Так что, если бы был способ использовать этот метод без точки? Угадай, что? Есть! Это достигается с помощью директивы ForceType Apache.

Директива ForceType позволяет вам переопределять любые настроенные вами типы MIME по умолчанию. Обычно его можно использовать для анализа HTML-страницы как PHP или чего-то подобного, но в этом случае мы будем использовать ее для анализа файла без расширения как PHP.

Поэтому вместо использования article.php, как мы это делали в методе 1, переименуйте этот файл в «article». Затем вы сможете получить к нему доступ следующим образом: http://www.domain.com/article/999/12/, используя функцию обратного просмотра Apache и переменную PATH_INFO, как описано в методе 1. Но сейчас Apache не знает к этой «статье» нужно разобрать как php. Чтобы сказать это, вы должны добавить следующее в ваш файл .htaccess.

 <Files article>  ForceType application/x-httpd-php  </Files> 

Это известно как «контейнер». Вместо применения директив ко всем файлам, Apache позволяет вам ограничивать их по имени файла, расположению или каталогу. Вам нужно создать контейнер, как указано выше, и поместить в него директивы. В этом случае мы используем файловый контейнер, мы определяем «article» как файл, который нас интересует, и затем мы перечисляем директивы, которые мы хотим применить к этому файлу, прежде чем закрывать контейнер.

Размещая директиву внутри контейнера, мы сообщаем Apache, что нужно анализировать « article » как скрипт PHP, даже если он не имеет расширения файла. Это позволяет нам избавиться от периода в URL, который вызывает проблемы, и все же использовать метод PATH_INFO для управления нашим сайтом.

недостаток:

Единственный недостаток этого метода по сравнению со способом 2 состоит в том, что ваши URL-адреса будут немного длиннее. Например, если бы я использовал этот метод на своем сайте, мне пришлось бы использовать URL-адреса, подобные этим: http://www.online-literature.com/ol/homer/odyssey/ вместо http: // www. online-literature.com/homer/odyssey/. Однако если бы у вас был сайт, подобный SitePoint, и вы использовали этот метод, это не было бы такой проблемой, так как URL (http://www.SitePoint.com/article/755/12/) имел бы больше смысла.

Вывод

Я выделил 3 метода создания URL-адресов, удобных для поисковых систем, и их недостатки. Очевидно, вы должны оценить эти недостатки, прежде чем решить, какой метод реализовать. И если у вас есть какие-либо вопросы по поводу реализации этих методов, они часто обсуждаются на форумах SitePoint, так что просто зайдите и сделайте сообщение.