mod_rewrite на апаче под винду

filips

Новичок
mod_rewrite на апаче под винду

как заставить работать mod_rewrite в апаче на винХР и как сделать .htaccess?
если я просто кидаю в роот папку .htaccess то сервер сразу ошибку выдает
 

filips

Новичок
MD
error.log тебе поможет.
[Tue Jun 20 11:32:31 2006] [alert] [client 127.0.0.2] c:/root/credit/.htaccess: Invalid command 'RewriteEngine', perhaps mis-spelled or defined by a module not included in the server configuration

на хостинге все работает с тами настройками htaccess
 

Gorynych

Посетитель PHP-Клуба
filips в общем-то, как верно написал MD, хотелось бы не ответ от сервера клиенту, а что там в логах :)

заодно: а что собственно пишем в .htaccess? Что в httpd.conf в AllowOveride (см. http://httpd.apache.org/docs/1.3/mod/core.html#allowoverride)?

-~{}~ 20.06.06 11:35:

о... по поводу RewriteEngine:

подключен ли модуль mod_rewrite в httpd.conf?
Код:
[b]httpd.conf:[/b]:

...
# Dynamic Shared Object (DSO) Support
...
LoadModule rewrite_module modules/mod_rewrite.so
...

ClearModuleList
...
AddModule mod_rewrite.c

...
 

Talker

Новичок
Gorynych
что нужно указать в AllowOveride, чтобы Mod_rewrite работал, а авторизация не включалась. Все значения кроме None и All выдают ошибку 500 (Apache 1.3.27). Конечно проще убить на локале строчки автоирзации в .htaccess, но хочется найти цивильное решение :)

Подскажите, как правильно построить регулярное выражение. Задачка такая: к каждому скрипту передается параметр стиля оформления (их два, условно style1 и style2). Разбираю его таким правилом

RewriteRule ^(style1|style2)/guest[/]?$ /guest.php?style=$1 [L,QSA]
Как изменить это правило, чтобы обращение guest/ вызывало просто /guest.php?style= (в самом скрипте по умолчанию ставится Style1). Вижу как решить проблему добавлением ещё одного правила, а как сделать в этом же правиле?
 

Gorynych

Посетитель PHP-Клуба
Talker
авторизация тут вообще не при чем. Авторизация - это отдельный набор дирректив. Если на каталог установлена авторизация - она работает независимо и самостоятельно.

правило, которое Вы написали, трактууется так (при условии, что .htaccess находится в каталоге DOCUMENT_ROOT):

при обращении по адресам:

http;//ваш_хост/style1/guest
http;//ваш_хост/style1/guest/
http;//ваш_хост/style2/guest
http;//ваш_хост/style2/guest/

будет происходить перенаправление на скрипт guest.php, расположенный в корневом каталоге, с передачей ему GET-параметра style со значением style1 или style2.

я не совсем понимаю формулировку вашей задачи и что Вам на самом деле нужно, поэтому посоветовать какое-либо "цивильное решение" не возьмусь.

P.S. хотя на это форуме и считается шиком изъясняться плохим языком (как русским, так и PHP) и сокращенными формулировками, хорошо и внятно сформулированный вопрос может помочь как спрашивающему, так и отвечающим :)
 

Talker

Новичок
Gorynych
Авторизация - это отдельный набор дирректив.
Это мне знакомо :) Вопрос был в другом. Если AllowOveride стоит в None, то директивы авторизации не выполняются (равно как и mod_rewrite). Если AllowOveride стоит в All, то выполняются и директивы авторизации и правила mod_rewrite. Что нужн поставить в AllowOveride, чтобы mod_rewrite работал, а авторизация нет (разумеется, всё это для работы на локалхосте).

я не совсем понимаю формулировку вашей задачи
Нужно чтобы вдобавок к тем четырем в этом же правиле обрабатывались запросы
http;//ваш_хост/guest
http;//ваш_хост/guest/
т.е. обработать случай пропущенного параметра Style.
 

Gorynych

Посетитель PHP-Клуба
Talker
Э... Вы вообще что сделать-то пытаетесь? У вас там уже есть директивы авторизации? Если вы поставите
Код:
AllowOveride FileInfo
(что, в принципе, достаточно) у Вас будет вылетать 500 ошибка о том, что директивы Auth... не допустима в данном файле .htaccess

обрабатывать случай упущенного параметра Style элементарно:

измените свое условие так, чтобы часть (style1|style2) была необязательной, примерно так же, как у Вас сделано с заверщающим слешом:
Код:
RewriteRule ^((style1|style2)/)?guest[/]?$ /guest.php?style=$1 [L,QSA]
(...) - представляют собой группировку в блок
? - модификатор, делающий присутсвие этой части выражения необязательным. таким образом:
Код:
^((style1|style2)/)?...
говорит о том, что начальная часть (перед guest/) может отсутствовать и представлять из себя style1/ или style2/

я так чувствую, что Вы не очень знаете регулярные выражения, и конфигурационные файлы и мехенизм переопределения URL-ов. Стоит подучить мат.часть :)
 

Talker

Новичок
Вы вообще что сделать-то пытаетесь?
Пытаюсь запретить на локале появление окон авторизации (потому как пусть к .htpasswd прописан в папках сервера и на локале не открывается ). То, что это можно сделать закоментировав стрчоки авторизации в htaccess знаю, сделал, но хотелось сделать это через настройку сервера.

обрабатывать случай упущенного параметра Style элементарно
Элементарные вещи всегда сложнее сделать :)

Это первое, что пытался сделать :) А не сработало, потому в переменную уходил style1/ или style2/ Сделал
работает :)
Спасибо за помощь.

Стоит подучить мат.часть :)
Это точно, век живи - век учись. Уже четвертый год на PHP работаю, и постоянно оказывается что не знаю какие-то простые вещи :)
 

Gorynych

Посетитель PHP-Клуба
Talker
Это первое, что пытался сделать А не сработало, потому в переменную уходил style1/ или style2/ Сделал
да, я заранее знал, что слэш будет попадать в параметр. Но это лучше, чем вариант:
Код:
(style1|style2)?[/]?guest[/]?$
- в этом случае правилу будет соответствовать и запрос вида
Код:
http://ваш_хост/style1guest/
, что не есть хорошо! Проше (лучше на мой взгляд :) ) всегда удалять из получаемого параметра слеш с последней позиции:
Код:
$style = (isset($_REQUEST['style']) ? $_REQUEST['style'] : null);
$style = preg_replace("/\/$/", '', $style );
 

Talker

Новичок
в этом случае правилу будет соответствовать и запрос вида
Хорошего в этом ничего нет, но и плохого тоже пока не вижу. Выплыть может только если делать разбор по (.+), но у меня это не используется.

всегда удалять из получаемого параметра слеш с последней позиции:
Кроме стилей ещё несколько параметров, обрабатывать все - лень :)

За совет спасибо.
 
Сверху