Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:
реклама

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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) из всех окромя последнего.

Vladimir N. Zaytcev <2:5015/116>

Еще есть второй вариант. Его можно использовать, если 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, то лучше используйте его.


Оглавление

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
44K
27 октября 2008 года
scard
1 / / 27.10.2008
Мне нравитсяМне не нравится
27 октября 2008, 14:43:26
"Тёма" - использование хтакцесс удобно конечно - но за все надо платить - если нужно обеспечить производительность вебсервера-надо обращать внимание на всё, где можно потерять драгоценные временные доли секунд-использование "подстроечного" файла .htaccess в таком случае как раз и приводит к потерям - это удобно использовать во время разработки - чтобы не париться с вечным перезапуском вебсервера когда чтото нужно поменять "на лету" и когда имеется множество проектов, требующих разной конфигурации-тогда да-основа конфига в основном файле-а в хтакцесс "подводки" - но и тут можно наступить на грабли - лучше делать и в таком случае именно конфигурации толлько для виртуальных серверов, конфигу каждого виртуального сервера делать под проект
Автору спасибо-хоть и статейка древненькая-но думаю многим помогла :)
2.
Аноним
Мне нравитсяМне не нравится
4 мая 2006, 20:35:59
а в .htaccess прописать не судьба? Зачем обязательно в http.conf ?
3.
Аноним
Мне нравитсяМне не нравится
17 октября 2005, 18:43:22
Спасибо! Вариант 2 с небольшой модификацией работает и для perl.
Что плохо, при таком использовании, http-error.log напоняется ошибками типа
File does not exist: /usr/local/www/data/dedddddddd

Видимо поэтому автор и советовал использовать mod_rewrite.
4.
Аноним
Мне нравитсяМне не нравится
15 февраля 2005, 14:54:07
объясните в примере, что делает каждая строчка, а то перебиваем как мартышки. Лушче самом понять.
5.
Аноним
Мне нравитсяМне не нравится
27 июля 2004, 15:29:33
обязательно используем
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог