Вместо ссылок вида www.myserver.ru/catalog/list.php?SECTION_ID=431&PRODUCT_ID=3789 хочу иметь такие www.myserver.ru/catalog/mobile/nokia_3310/
-Решение-
1. Создание поддиректорий
Самый простой способ - это создать для каждого раздела/статьи поддиректорию и поместить туда файл index.php. Использовать данный метод имеет смысл на сайтах с небольшой структурой.
2. Обработка 404 ошибки
В файл .htaccess пишем:
ErrorDocument 404 /404.php
Эта строка указывает серверу перенаправить запрос на скрипт /404.php, если запрошенный файл не был найден. Когда пользователь наберет несуществующий адрес www.myserver.ru/catalog/mobile/nokia_3310/, сервер перенаправит запрос на скрипт 404.php со всеми переменными окружения. В $_SERVER["REQUEST_URI"] будет содержаться запрошенный пользователем URI (/catalog/mobile/nokia_3310/). Остается только "вытащить" из строки '/catalog/mobile/nokia_3310/' необходимые идентификаторы.
Однако страница 404 будет выдавать браузеру заголовок "HTTP/1.1 404 Not Found", а страницы с таким заголовком не индексируются поисковиками, поэтому в начале файла 404.php пишем:
header("HTTP/1.1 200 OK");
Минусов у данного способа два: а) нельзя посылать на несуществующий URL данные методом POST б) Лог ошибок сервера будет забит (необходимо либо отключить ведение лога, либо периодически его чистить).
3. Модуль Apache mod_rewrite
В файле .htaccess с помощью регулярных выражений прописываются правила, по которым Apache должен сделать соответствующие перенаправления. Например,
RewriteEngine On
RewriteBase /
RewriteRule ^catalog/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)/?$ catalog/list.php?SECTION=$1&PRODUCT=$2
Каждый запрос Apache будет сопоставлять с шаблоном '^catalog/([a-zA-Z0-9\-_]+)/([a-zA-Z0-9\-_]+)/?$' и в случае совпадения (например, пользователь набрал www.myserver.ru/catalog/mobile/nokia_3310/) перенаправит запрос на скрипт /catalog/list.php, в котором переменная $_GET["SECTION"] будет равна 'mobile', а $_GET["PRODUCT"] - 'nokia_3310'.
4. Директива FilesMatch
В .htaccess пишем:
Action throw /handler.php
<FilesMatch "^([^\.]+)$">
ForceType throw
</FilesMatch>
Теперь запросы, удовлетворяющие маске "^([^\.]+)$" (все запросы, кроме тех, что содержат точку) будут перенаправляться на скрипт handler.php. Маски для файлов можно задать и другие, разумеется. Этот способ позволяет передавать данные методом POST.