Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FAQ. Apache. mod_rewrite. Начни с простого. Было много вопросов. Написал статейку. 
:(
    Опции темы
Mal Hack
Дата 21.5.2005, 21:09 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 15
Всего: 261



Данный модуль веб-сервера Apache предназначен для преобразования исходных URL'ов. Его возможности - колоссальны, но зачастую он используется для создания ЧПУ (Человеко Понятный УРЛ). Что это значит. Вместо http://example.com/index.phtml?year=2005&m...y=31&news=theme использовать http://example.com/2005/12/31/theme.html. Такой механизм очень часто применяется на новостных сайтах. В тоже время это плюс для безопасности. Пользователи не видят к какому файлу (скрипту) реально идет обращение.

Ниже рассмотрим несколько вопросов:
1. Как включить mod_rewrite на Apache?
2. Немножко теории. Как работает mod_rewrite.
3. Простой пример.
4. Что надо сделат в скрите?
5. Что дает данный подход и mod_rewrite в целом?
6. Возможные ошибки.
7. Альма-Матер дл изучения mod_rewrite

1. Как включить mod_rewrite на Apache?

Для включения mod_rewrite на веб-сервере Apache необходимо отредактировать файл httpd.conf.
Для этого открываем файл httpd.conf, ищем строчку:
Код
#LoadModule rewrite_module modules/mod_rewrite.so

И убираем комментарий
Код
LoadModule rewrite_module modules/mod_rewrite.so

После чего перезапускаем веб-сервер.

2. Немножко теории. Как работает mod_rewrite.

Как правило, только что столкнувшиеся с mod_rewrite, программисты не понимают до конца как работает данный механизм. Из-за этого долгое время ломают голову над «детскими ошибами.

Итак. Как мы знаем есть, так называемый GET запрос, т.е. http://example.com/2005/12/31/theme.html, который «приходит» на веб-сервер (в нашем примере - Apache). Что делает сервер. Первым делом он смотрит настройки данного хоста. После чего уже принимает решение, что делать дальше. Либо отправить пользователю обратно содержимое заглавной странцы (index.html, к примеру) или отправить на интерпретацию код заглавного скрипта index.php или вернуть ошибку 404 и т.д. и т.п.. Предположим, что у нас дальше пойдет работа с index.phtml. Что будет дальше вы уже наверняка знаете. Мы же остановимся на том моменте, когда сервер смотрит настройки хоста. Их может быть большое множество. Но в обязательном порядке сервер пытается найти в корне файл .htaccess. (файл конфигурации Apache «на лету»). Вот именно в этом файле находятся правила преобразования mod_rewrite (они могут находиться и в httpd.conf). Т.е. я все веду к тому, что преобразование URL’ов ведется ДО работы скриптов.

Алгоритм следующий:
1. Сервер получает GET запрос: http://example.com/2005/12/31/theme.html
2. Находит в .htaccess правила преобразования mod_rewrite.
3. Преобразовывает.
4. Перенаправляет на index.phtml согласно правилам преобразования.
5. Скрипт начинает работать.

3. Простой пример.

Многие из вас видели такую вещь: http://example.com/2005/12/31/theme.html . Такие адреса часто используют новостные сайты. Естественно у них нет всех этих папок и html файлов. Все данные обрабатывает скрипт. Ниже мы рассмотрим один из вариантов такого преобразования. Скажу сразу. Вариантов уйма я лишь беру один частный случай, которым сам пользуюсь и считаю его наиболее универсальным.
Код
 RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.phtml [L,QSA] 

Рассмотрим все по порядку.
Два подряд RewriteCond это условия, между которыми стоит И.
Т.е. Если запрашиваемый адрес не является реально существуемым файлом или каталогом перекидываем на index.phtml. Т.е. таким образом мы реализовали то, что у нас запросы http://example.com/2005/12/31/theme.html будут обрабатываться скриптом index.phtml. Теперь весь вопрос, как нам узнать в скрипте что пользователь запрашивает /2005/12/31/theme.html.

Тут лирическое отклонение. Несколько слов о RewrtiterRule. Директива рассматривает параметра. Первый (в нашем случае: ^(.*)$) – строка регулярного выражения, которая проверяет, удовлетворяет ли запрашиваемый адрес (в нашем случае: /2005/12/31/theme.html) паттерну (в нашем случае да, т.к. паттерн гласит: «любой символ 0 и более раз» от начала и до конца строки - ^(.*)$). В случае удовлетворения паттерну, mod_rewrite перенаправляет запрос на файл, указанный во втором параметре (в нашем случае: index.phtml).

Теперь весь вопрос в том, как скрипт узнает о «/2005/12/31/theme.html». Есть два варианта.
Первый:
Код
RewriteRule ^(.*)$ index.phtml?$1 [L]
, где «/2005/12/31/theme.html» будет передано скрипту index.phtml в переменную QUERY_STRING, т.к. $1 – первые круглые скобки в паттерне, что будет равносильно: http://example.com/?/2005/12/31/theme.html. Но, вы где-ть такое видели? Нет. Поэтму, мы используем в качестве ключа QSA.

Есть переменная сервера (к которым скрипты имеют доступ) REQUEST_URI в котором всегда содержится GET запрос («/2005/12/31/theme.html»). Итак, если мы перенаправляем на index.phtml, то REQUEST_URI должен получить значение index.phtml, НО ключ QSA заменяет его НА «/2005/12/31/theme.html». Т.е. мы физически перенаправляем на index.phtml, а логически показываем скрипту, что пользователь обращался к «/2005/12/31/theme.html».

4. Делаем скрипт

Теперь мы уже работаем с index.phtml, скриптом, на который мы произвели перенаправление. Говорю сразу, код на PHP, т.к. другими языками под веб владею плохо.
Код
<?php 
$arr = explode( '/' , $_SERVER['REQUEST_URI'] );
// Разбиваем переменную $_SERVER['REQUEST_URI'] на массив элементов по символу '/'.
print $arr[1] . '<br>';
print $arr[2] . '<br>';
print $arr[3] . '<br>';
print $arr[4] . '<br>';
?>


Вот так все просто. Теперь вы можете оперировать с данным массивом. Дабы было еще понятне. Приведу аналогию. Предположим такой адрес: http://example.com/index.phtml?year=2005&m...y=31&news=theme. Как мы знаем, что в скрипте данные параметры будут доступны через массив $_GET.
так вот, $_GET[‘year’] то же, что и $arr[1], $_GET[‘month’] то же, что и $arr[2], $_GET[‘day’] то же, что и $arr[3], $_GET[‘theme’] то же, что и $arr[4] (только надо будет еще отрезать «.html»).

5. Что дает данный подход и mod_rewrite в целом?

Во-первых для поисковых систем намного приятнее URL вида: http://example.com/?/2005/12/31/theme.html, нежели http://example.com/index.phtml?year=2005&m...y=31&news=theme, да и для пользователей, согласитесь тоже.

Второй момент. При mod_rewrite практически на «нет» сводится возможность XSS нападения, т.к. include-баг практически перекрывается. На данном примере это не так видно, но поверьте на слово, это так. НО в любом случае все зависит от вашей головы !!!

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

6. Возможные ошибки

Как правило могут возникуть следующие ошибки:

404 – документ не найден. Причина: правила RewriteRule не срабатывают.
403 – Forbidden – доступ запрещен. Правила реврайта содержат логическую ошибку, которая возникает из-за попытки редиректа на файл, куда нет доступа (/index.php – выдаст именно это, т.к. / в UNIX системах означает путь от корневого каталога СЕРВЕРА, куда само собой у вас доступа не будет).
500 – Internal Server Error. Причина в синтаксическо ошибке в файле .htaccess.

7. Альма-Матер дл изучения mod_rewrite

Лично мне эта статья очень помогла. Вот ее аннотация, а ниже я прикрепляю ZIP файл. В нем - эта статья в RTF формате,

Цитата
«Главное преимущество даваемое Вам mod_rewrite — это возможности конфигурирования и гибкость присущие Sendmail. Обратная сторона mod_rewrite — это возможности конфигурирования и гибкость присущие Sendmail».

-- Brian Behlendorf

Apache Group
«Несмотря на тонны примеров и документацию, mod_rewrite это Вуду. Чертовски клёвый Вуду, но все-таки Вуду.»

-- Brian Moore
[email protected]

Добро пожаловать в мир mod_rewrite, швейцарский нож URL преобразований!
Этот модуль использует механизм основанный на правилах (синтаксический анализатор основанный на регулярных выражениях) для преобразований URL на лету. Он поддерживает неограниченное количество правил и неограниченное количество связанных с правилом условий для реализации действительно гибкого и мощного механизма для URL преобразований. URL преобразования могут зависеть от разных критериев, например переменных сервера, переменных окружения, HTTP заголовков, времени и даже запросы к внешним базам данных в разных форматах, могут быть использованы для достижения действительно точного соответствия вашим ожиданиям, преобразованных URL.

Этот модуль оперирует с полными URL (включая path-info) и в контексте сервера (httpd.conf) и в контексте каталога (.htaccess) и даже может генерировать части строки запроса в качестве результата. Преобразованный результат может приводить к внутренней обработке, внешнему перенаправлению запроса или даже к прохождению через внутренний прокси модуль.

Однако вся эта функциональность и гибкость имеет свой недостаток: сложность. Поэтому не ожидайте что вы поймете весь этот модуль за один день.
Этот модуль был придуман и написан в апреле 1996 и эксклюзивно подарен The Apache Group в июле 1997 

Ralf S. Engelschall
[email protected]
www.engelschall.com


Это сообщение отредактировал(а) Mal Hack - 21.5.2005, 22:03

Присоединённый файл ( Кол-во скачиваний: 1553 )
Присоединённый файл  mod_rewrite.zip
PM ICQ   Вверх
Wowa
Дата 22.5.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: 2
Всего: 290



PM WWW   Вверх
Гость_123
Дата 2.6.2005, 18:35 (ссылка)    |    (голосов: 1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Zdrastvuyte pomogite pozhalusta smile

imyu vot eto----

http://localhost/practicas/noticias/detalle.php?id=2


hochu chtob bilo vot eto---


http://localhost/practicas/noticias/detalle.php/id=2


delauy po raznomu i nichego smile

1- RewriteEngine on
2-RewriteRule ^/(.+)/dn_pg=(.+) /cgi-bin/detalle.cgi?id=$1&name=$2 [T=application/x-httpd-cgi,L] (ne znayu chto na chto nado pravilyno zamenit')
ili vot eto
RewriteRule ^(.*)shop/(.*)$ $1detalle.php/
RewriteRule ^robots.txt$ /text.cgi?%{REQUEST_URI}

Spasibo smile

  Вверх
Mal Hack
Дата 2.6.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 15
Всего: 261



Ваши преобразования мне не понятны в корне.
Это
RewriteRule ^(.+)/(.+)=(.+?)$ $1?$2=$3
Цитата
imyu vot eto----

http://localhost/practicas/noticias/detalle.php?id=2


hochu chtob bilo vot eto---


http://localhost/practicas/noticias/detalle.php/id=2


PM ICQ   Вверх
Гость_123
Дата 2.6.2005, 19:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ya hochu chtob sayt ne imel znaka voprosa(chtob ne bilo etogo detalle.php?id=2
a bilo vot eto detalle.php/2
  Вверх
Mal Hack
Дата 2.6.2005, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 15
Всего: 261



Код
RewriteRule ^(.+)/(.+)=(.+?)$ $1?$2=$3

При запросе
http://localhost/practicas/noticias/detalle.php/id=2
будет перенаправление на уровне сервера на
http://localhost/practicas/noticias/detalle.php?id=2

ЗЫ: Зарегистрируйтесь на форуме это даст вам много преимуществ smile

PM ICQ   Вверх
Гость_123
Дата 2.6.2005, 19:35 (ссылка)    |    (голосов: 2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











u menya schas net vremeni registrirovatsya i ya ne ponimayu chto ti mne za kod pishesh
  Вверх
Гость_123
Дата 2.6.2005, 19:35 (ссылка)    |    (голосов: 1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











smile
  Вверх
Mal Hack
Дата 2.6.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 15
Всего: 261



Я тебе написал правило преобразования mod_rewrite под то, что ты сказал.
PM ICQ   Вверх
Гость_123
Дата 2.6.2005, 19:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











RewriteEngine on

Options FollowSymLinks

RewriteRule /tut nado napisat' to chto budet mne menya etot nekrawiviy adres http://localhost/practicas/noticias/detalle.php?id=2
na etot krasiviy
http://localhost/practicas/noticias/detalle.php/2 (chtob ya pisala .... detalle.php/2 i mne vidavalis' dannie ot syuda http://localhost/practicas/noticias/detalle.php?id=2

na drugom kompyuteri vrode kak deystvuet eto

RewriteEngine on
Options FollowSymLinks
RewriteRule /articulo/(.+) /detalle.php?id=$2
RewriteRule ^forums/(.+) detalle.php?id=$2

no u menya net smile
  Вверх
Гость_123
Дата 2.6.2005, 19:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ti hochesh skazat' chto ya napishu vot eto

RewriteEngine on
Options FollowSymLinks
RewriteRule ^(.+)/(.+)=(.+?)$ $1?$2=$3 i u menya vse budet funkcionirovat'? (ne pravda)
mi nigde dazhe ne ukazivaem kak nazivaetsya fail kotoriy ya hochu chtob mne pokazal smile smile smile
  Вверх
Гость_123
Дата 2.6.2005, 19:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











a mozhet nado po raznomu pisat' dlya apache 1 i dlya apache2?

potomu chto tot primer kotoriy ya govorila chto robotaet tak dlya apache1,a u menya apache 2 i ne robotaet ono smile smile
  Вверх
Mal Hack
Дата 2.6.2005, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 15
Всего: 261



Пиши на русском пожалуйста.
К тебе на хост идет запрос:
http://localhost/practicas/noticias/detalle.php/2
После правила RewriteRule ^(.+)/(.+)$ $1?id=$2 т.к. в $1 будет http://localhost/practicas/noticias/detalle.php, затем ? затем id=, затем $2, т.е. 2.

PM ICQ   Вверх
Гость_123
Дата 2.6.2005, 20:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ogromnoe spasibo smile smile

P.S. kirilicey pisat' ne umeyu (pochti ne umeyu)
  Вверх
Gorcer
Дата 21.12.2005, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 30.6.2004
Где: Владивосток

Репутация: нет
Всего: 4



здраствуйте, у меня в модреврайте все папки жестко прописаны, и если папка не существует то всё переправляется на main.php, но мне хочется сделать папку downloads в которой будут лежать другие папки и файлы....и чтоб modrewrite то что там будет вабще никак не трогал.
как это сделать?


--------------------
Больнее всего получить удар от человека которому доверяешь.

<удалено администрацией>
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Администрирование Web серверов и Web служб | Следующая тема »


 




[ Время генерации скрипта: 0.1442 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.