[apache] как настроить пересылку запроса

oleg1331

возможна ли настройка apache для конкретного (одного) сайта так, чтобы все запросы к файлам .php .htm .html и т.д. вида http://mysite.ru/a/b/c.htm перенаправлялись на http://mysite.ru/index.php&lnk="a/b/c/.htm"...
параметр lnk, естесственно, без кавычек и все нехорошие символы экранированы. Ну то беж чтобы php в php запрашиваемы относительный адрес передавался в качестве параметра lnk

artimon

Чем тебя mod_rewrite не устраивает?

oleg1331

может быть и устраивает только я не знаю где чего и как писать что можно почтать по сабжу? не слишком сложное - так, для ознакомления.

2354570

http://www.test.graflekx.ru/pagestop-2-page-1.html
Вот, для начала. Сейчас поищу апачевские how-to's по mod_rewrite, там куча наглядных примеров.

2354570

http://httpd.apache.org/docs/1.3/misc/rewriteguide.html
Вот practical solutions, там почти наверняка есть то, что тебе надо.

2354570

А вообще, по идее, такая конструкция должна помочь
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?lnk=$1 [L,QSA]
</IfModule>

oleg1331

спасибо. Читаю, разбираюсь Интересно, блин... Знал, что такое возможно, вот теперь и сам буду уметь

oleg1331

по примеру кода: если убрать строку
RewriteCond %{REQUEST_FILENAME} !-f
то все работает. Эта строка ведь поидее должна запрещать прямой доступ к файлу? Или как?.. Почему из-за нее не работает?

oleg1331

а если шаблон изменения адреса исправить так:
RewriteRule ^(.*)?(.*)$ index.php?lnk=$1&$2 [L,QSA]
то он и параметры для пхп будет правильно обрабатывать. вроде бы.. так ведь?

2354570

а если шаблон изменения адреса исправить так:
RewriteRule ^(.*)?(.*)$ index.php?lnk=$1&$2 [L,QSA]
то он и параметры для пхп будет правильно обрабатывать. вроде бы.. так ведь?
По идее, да. Только ? - спецсимвол, его надо экранировать.
RewriteRule ^(.*)\?(.*)$ index.php?lnk=$1&$2 [L,QSA]

oleg1331

однако тогда странно получается.
ссылка: http://test2.ru/hhh.html?
на RewriteRule ^(.*)\.html?$ index.php?lnk=$1 [L,QSA] работает, а на RewriteRule ^(.*)\.html\?$ index.php?lnk=$1 [L,QSA] не хочет..
вообще пытаюсь заставить шаблон работать только для определенных файлов типа .htm .html .php

artimon

Зачем передавать путь запроса как параметр?
Он и так будет известен в скрипте, см. глобальный массив $_SERVER

2354570

Зачем передавать путь запроса как параметр?
Это второй вопрос, я его намеренно не ставил. Иначе топикстартеру никогда бы не довелось ближе познакомиться с mod_rewrite, а это очень полезно.

oleg1331

жгете ребята.. а я сижу мучаюсь тут с мод_врайтом. Пока не шибко выходит Но сегодня надеюсь домучать его хоть до какой-нибудь степени.
И потом. Мучиться мне с ним все равно придется, т.к. мне же не все нужно перенаправлять на мой index.php. Так что сижу читаю маны...
Но то что не нужно возиться с параметрами - это уже гуд. Ссылку можно брать из REDIRECT_URL, а параметры и так все передадутся. так ведь?

2354570

однако тогда странно получается.
ссылка: http://test2.ru/hhh.html?
на RewriteRule ^(.*)\.html?$ index.php?lnk=$1 [L,QSA] работает, а на RewriteRule ^(.*)\.html\?$ index.php?lnk=$1 [L,QSA] не хочет..
вообще пытаюсь заставить шаблон работать только для определенных файлов типа .htm .html .php
Гм. Странно, должен сработать и второй вариант. Разницу между первым и вторым ты понимаешь, я думаю?

2354570

Я по своему опыту скажу, что лучше день (два, три, месяц) позаниматься сексом с мод_рерайтом, а потом его нормально понимать, чем сейчас бросить и потом спрашивать простые вещи в форумах. Это "чёртово вуду" (характеристика дана участником проекта Apache и мало кто в нём нормально разбирается - в своё время на флокал мне на простой (как выяснилось позже) вопрос ответа не дали.
Ссылку можно брать из REDIRECT_URL, а параметры и так все передадутся. так ведь?
О какой ссылке речь?

oleg1331

теоретически - да.
а еще я теоретически понимаю, почему (html)|(htm)|(php) не работает. только вот как это заставить работать...

oleg1331

с которой мы пришли. т.е. если приходим с http://site.ru//hhhdd.html?param=123&param2=456
то [REDIRECT_URL] => /hhhdd.html

2354570

теоретически - да.
а еще я теоретически понимаю, почему (html)|(htm)|(php) не работает. только вот как это заставить работать...
Погоди. У тебя ключевая разница в первом и втором варианте в том, что первый допускает наличие или отсутствие после .html любого символа. А второй строго требует именно наличия символа ?.
Приведи своё правило с ветвлением по скобкам, посмотрим. И чётко, чётко опиши - чего ты хочешь добиться, а то я уже начал путаться =)

2354570

с которой мы пришли. т.е. если приходим с http://site.ru//hhhdd.html?param=123&param2=456
то [REDIRECT_URL] => /hhhdd.html
Ага.

oleg1331

со скобками уже разобрался. Мне хотелось, чтобы на index.php перенаправлялись только страницы .html .htm .php так что регэксп выглядит сейчас примерно так:
  RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.(html|htm|php\?(.*?$ index.php [L]

Вот. А теперь я хочу добиться того, чтобы все остальные запросы (к картинкам, js скриптам и т.п. просто перенаправлялись в другую аудиторию. Вот сижу шаманю. Вот это
  RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*) /modules/$1 [L]

почему-то не работает. хотя в оф. документации сказано, что вот это:
 for request ``GET /somepath/pathinfo'':

^/somepath(.*) /otherpath$1 /otherpath/pathinfo

должно работать.

2354570

со скобками уже разобрался. Мне хотелось, чтобы на index.php перенаправлялись только страницы .html .htm .php так что регэксп выглядит сейчас примерно так:
Само условие правильно.
Вот дальше вопрос - ты перенаправил на index.php, но никакие параметры ему не передал. Зачем тогда было выделять $1 и $2 из запроса?

oleg1331

хм. действительно. Тогда делаем так:
^.*\.html|htm|php(\?(.*?$ 

а что на счет того, чтобы все остальное перенаправлять в /modules/$1 почему не хочет работать?

2354570

а что на счет того, чтобы все остальное перенаправлять в /modules/$1 почему не хочет работать?
А ты точно задал параметры после '?' ?
Не убирай скобки подвыражений, читаемость теряется.
Такое правило должно сработать, имхо.
 
RewriteRule ^(.*)\.(html|htm|php\?(.*?$ /modules/$3 [L, QSA]

oleg1331

не! не то.. имеется в виду вот что:
все файлы .html .htm .php перенаправлять на /index.php. С этим я вроде бы справился.
А для всех остальных добавлять в начало еще одну директорию. Т.е., предположим, запрос /123.txt нужно преобразовывать в /modules/123.txt

2354570

А для всех остальных добавлять в начало еще одну директорию. Т.е., предположим, запрос /123.txt нужно преобразовывать в /modules/123.txt
Ну, добавь ещё один RewriteRule ниже, их может быть столько, сколько нужно.

oleg1331

дык добавлять то добавляю.. только вот не работает Опять похоже что-то перемудрил с регулярками :
 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*) /modules/$1 [L]

2354570

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /modules/$1 [L]
Вот так попробуй.

oleg1331

нифига. ругается на регэксп (выдает 500 ошибку)

oleg1331

up. Я уже в ступоре.. никак не получается написать нужный шаблон
Оставить комментарий
Имя или ник:
Комментарий: