Одной из главных причин для использования PHP как серверного языка является возможность генерировать динамический контент. Обычно один скрипт генерирует множество страниц на основе входных параметров (переменных в URL).
Этот урок о том, как представить эти параметры в URL в чистом и дружественном виде для чтения человеком (ЧПУ - веб-адреса, удобные для восприятия человеком).
Если Вы не совсем понимаете о чём я, взгляните на следующий пример. Наш сайт (site.com) хранит каждый из своих уроков в таблице бд lessons. И сейчас мы могли бы сделать так, чтобы каждый отдельный урок был доступен по своему id вот так:
http://site.com/lessons.php?lesson_id=1234
Но это не лучший способ. Если люди прочитают большое количество уроков на сайте, то в истории адресной строки браузера будет куча URL с разными id и они не смогут вернуться к нужной статье. Людям придётся делать закладки или идти на главную страницу сайта и искать нужный урок.
Что ещё более важно, Вы не используете важные данные, которые поисковые машины учитывают, индексируя Ваш сайт. Вот пример ЧПУ:
http://site.com/lessons/funny-cats
В этом уроке я расскажу, как создавать ЧПУ в PHP. Мы рассмотрим несколько методов, а также преимущества и недостатки каждого из них.
Используем Mod Rewrite для ЧПУ
Первый метод, который мы рассмотрим – модуль mod_rewrite, который поставляется с Apache. Этот модуль работает путём сопоставления запрошенных URL с набором предопределённых правил, а также передаёт данные в нужный скрипт в нужном формате.
Допустим, у нас есть скрипт news.php в корневой директории сайта (то есть он доступен по адресу http://site.com/news.php). Этот скрипт ответственен за вывод конкретной новости из бд, которая выбрана с помощью параметра news_id в URL.
Так что если бы Вам понадобилось получить доступ к статье с id 67, пришлось бы использовать этот адрес:
http://site.com/news.php?news_id=67
Но мы хотим улучшить ситуацию и использовать такой URL: http://site.com/news/67.html (это только для примера).
Используя mod_rewrite, добиться этого можно одним простым правилом. Нужно прописать в httpd.conf или в .htaccess файле в директории сайта следующее:
RewriteEngine on
RewriteRule ^/news/([0-9]+)\.html /news.php?news_id=$1
Используя регулярное выражение выше, мы находим все запросы к сайту, и преобразуем в формат /news/news_id.html. Участки, заключённые в скобки сохраняются в переменных, таких как $1 или $2 (в нашем случае только $1).
В скрипте news.php мы просто берём news_id параметр также, как бы мы это делали и в обычном случае:
$news_id = $_GET['news_id'];
ЧПУ в PHP с помощью Forcetype директивы Apache
Альтернатива использованию mod_rewrite – использовать директиву ForceType. Это позволит использовать php-скрипт без .php расширения. Обычно веб-сервера настроены так, что php-скрипты должны заканчиваться на .php, чтобы другие скрипты (такие как .html файлы) не обрабатывались PHP.
Возвращаясь к нашему примеру, вместо скрипта news.php в корневой директории, наш скрипт будет называться просто news. К нему можно будет получить доступ вот так: http://site.com/news.
Используя следующий код в httpd.conf или в .htaccess, файл news будет обработан на сервере как PHP файл:
<Files news>
ForceType application/x-httpd-php
</Files>
Теперь, когда мы делаем запрос по адресу: http://site.com/news/67.html, то напрямую попадаем на статью. А часть /67.html нам нужно спарсить. Она хранится в серверной переменной PATH_INFO.
echo $_SERVER['PATH_INFO'];
// выводит '/67.html'
Так что мы можем воспользоваться регулярным выражением, чтобы выделить число 67 из строки. Вот регулярка, которая ищет строку, которая точно имеет вначале знак слэша, а потом число, замыкаемое .html:
$path = $_SERVER['PATH_INFO'];
// $matches[0] хранит всю строку, а $matches[1]
// хранит строку соответствующую регулярному выражению в скобках,
// то есть то, что нам нужно
preg_match('!^/(\d+)\.html$!', $path, $matches);
// приводим строку в число
$news_id = (int) $matches[1];
Ну вот и всё. Теперь Вы можете использовать $news_id соответственно в скрипте. Конечно, если бы путь был в неправильном формате, $news_id был бы равен 0 после приведения к int. То есть, Вы будете в безопасности, если скрипт обратится к бд, даже если такой статьи не существует.
Вывод
В этой статье мы изучили несколько способов создания ЧПУ. На самом деле, я думаю, что поисковые системы, такие как Google, конечно же, проиндексируют страницы, основанные на GET параметрах. Однако помните, что использование ЧПУ – очень хороший тон в глазах поисковиков.