mod_rewrite
Каким образом создать ссылку, типа как у http://lenta.ru/2002/01/09/?
У ленты этот движок основан на mod_rewrite, имнсхо, поскольку там апач стоит
www.lenta.ru HTTP/1.1 200 OK Date: Fri, 11 Jan 2002 14:45:37 GMT Server: Apache/1.3.14 (Unix) rus/PL30.0
Соответственный rewrite rule регекспом - и все ок. а в директории хтмл'ки складывать - черезчур корявый изврат. 8)
Вот пример, как организовать подобное:
Vы хотим выводить новости из базы данных по запрошенному ури w3.lenta.ru/2002/01/11/tv6/ имея таблицу с полями новостей anchor VARCHAR(255), date date, announce VARCHAR(255), body TEXT; где anchor - текстовый указатель, date - дата, announce - анонс новости, body - тело новости.
Делаем виртуальный хост
--- [ httpd.conf ] --- LoadModule rewrite_module modules/mod_rewrite.so <VirtualHost 192.168.10.1> ServerName w3.lenta.ru DocumentRoot "/wwwroot/htdocs/w3lenta" RewriteEngine On RewriteLogLevel 2 RewriteCond %{REQUEST_URI} !/index\.php RewriteRule ^/([0-9][0-9][0-9][0-9]+)/([0-9][0-9]+)/([0-9][0-9]+)/(.*)/$ /news.php?anchor=$4&date=$1-$2-$3 [T=application/x-httpd-php,L] ErrorLog logs/w3lenta-error.log CustomLog logs/w3lenta-access.log common <Directory /wwwroot/htdocs/w3lenta> Options +Includes -Indexes </Directory> </VirtualHost> --- [ httpd.conf ] ---
сразу привожу извинения за длинный регексп - пхп/перловый
^/(\d{4}+)/(\d{2}+)/(\d{2}+)/(.*)/$ не прокатил. видимо модифер \d rewrite engine не понимает - у него там какие-то свои правила паттернов.
прописываем w3.lenta.ru в hosts на ip 192.168.10.1 (ip по вкусу - у кого как отстроен локальный айпишник) создаем два файла в корне /wwwroot/htdocs/w3lenta/:
1. этот будет отвечать на запрос w3.lenta.ru и в нем, допустим, строится листинг по таблице из 10-ти последних новостей, но мы сюда забьем тестируемый урл.
--- [ index.php ] --- <a href="/2002/01/11/tv6/">ТВ-6 распадается</a> --- [ index.php ] ---
2. этот будет выводить новость по date и anchor. кода не прописано, но сделать select announce, body, date from table where date=$date AND anchor=$anchor из таблицы новостей, я думаю, трудности никому не составит. 8)
--- [ news.php ] --- <? echo 'данные запрошенной новости: anchor = '.$anchor.', date = '.$date.' '; echo 'REQUEST_URI: http://'.getenv("HTTP_HOST").getenv("REQUEST_URI"); ?> --- [ news.php ] ---
набираем в ослике w3.lenta.ru, щелкаем линк, и наслаждаемся результатом 8)
данные запрошенной новости: anchor = tv6, date = 2002-01-11
REQUEST_URI: http://w3.lenta.ru/2002/01/11/tv6/
Remarks: в реале можно сделать, если админ конфиг пропишет или ты сам админ. 8)
Некоторые феньки rewrit'а (не могу сказать точно какие) работают только в версии апача выше 1.2 - я тестировал на 1.3.20. категорию прикрутить тоже несложно - просто соответствующих категориям регекспов налепить, убрав modifier L (last rule) из всех окромя последнего.
Еще есть второй вариант. Его можно использовать, если PHP установлен как модуль к Apache.
Сначала создадим свою страницу 404:
--- [.htaccess ] --- ErrorDocument 404 db.php --- [.htaccess ] ---
Далее создаем db.php:
--- [ db.php ] --- <? // Вернем 200 Ok // работает только если PHP установлен как модуль к Apache header("HTTP/1.0 200 OK"); $url=$_SERVER["REQUEST_URI"]; // теперь остается только обработать переменную $url. : ?> --- [ db.php ] ---
P.s. Если есть возможность использовать mod_rewrite, то лучше используйте его.
Оставить комментарий
Комментарии
Автору спасибо-хоть и статейка древненькая-но думаю многим помогла :)
Что плохо, при таком использовании, http-error.log напоняется ошибками типа
File does not exist: /usr/local/www/data/dedddddddd
Видимо поэтому автор и советовал использовать mod_rewrite.