Редирект внутри сайта при помощи .htaccess

beerdy

Новичок
Спасибо.
Получается значит вот что:
Код:
RewriteEngine On
 
RewriteBase /  

Options +FollowSymlinks 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9_-]+) index.php?variable1=$1 
RewriteRule ^test$ /test/indexad.php  [R=301, L]
А как теперь сделать чтобы при обращении к http://test.ru/test/hlink открывалась страница редиреккта http://test.ru/test/indexad.php?variable2=hlink
Я пробовал следующим образом
Код:
RewriteRule ^test/([a-z]+)$ /test/indexad.php?variable2=$1
Но в итоге срабатывает правило:
Код:
RewriteRule ^([a-z0-9_-]+) index.php?variable1=$1
Т.е. мне нужно чтобы при обращении к каталогу /test/ все параметры нередавались не /index.php?variableN а /test/indexad.php?variableN
 

beerdy

Новичок
Спасибо всем) разобрался.
Код:
RewriteEngine On
 
RewriteBase /  

Options +FollowSymlinks 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9_-]+)$ index.php?variable1=$1 // <-----сдесь забыл поставить конец строки $ 
RewriteRule ^test$ /test/indexad.php?variable2=$1  [R=301, L]
Остался лишь вопрос - что значит ...[R=301, L]?
 

Andykalinin

Новичок
'redirect|R [=code]' (вызывает редирект)

Префикс в Подстановке вида http://thishost[:thisport]/ (создающий новый URL из какого-либо URI) запускает внешний редирект (перенаправление). Если нет накакого кода в подстановке ответ будет с HTTP статусом 302 (ВРЕМЕННО ПЕРЕМЕЩЕН). Если вы хотите использовать дркгие коды ответов в диапазоне 300-400, просто напишите их в виде числа или используйте одно из следующих символических имён: temp (по-умолчанию), permanent, seeother. Используйте это в директивах, которые должны преобразовывать некие виртуальные URL в реальные и возвращать их клиенту, например, преобразовывать «/~» в «/u/» или всегда добавлять слэш к /u/user, и т.д.

Примечание: При использовании этого флага, убедитесь, что поле подстановки, это работающий URL! Если это не так, вы перенаправляете в никуда! И помните, что сам по себе этот флаг, только дополняет URL строкой http://thishost[:thisport]/, и процесс преобразования продолжается. Также, обычно вы хотите остановиться и сделать этот редирект немедленно. Для остановки процесса преобразования, вам также нужно написать флаг 'L'.


'last|L' (последнее правило)

Остановить процесс преобразования на этом месте и не применять больше никаких правил преобразований. Это соответствует оператору last в Perl или оператору break в языке C. Используйте этот флаг для того, чтобы не преобразовывать текущий URL другими, следующими за этим, правилами преобразований. К примеру, используйте это для преобразования корневого URL из ('/') в реальный, например, '/e/www/'.
Кстати в том виде что у тебя написано RewriteRule ^test$ /test/indexad.php?variable2=$1 [R=301, L] вызовет ошибку, ибо новый урл содержит test. Да и не должна папка тест реально существовать.
 

Andykalinin

Новичок
И еще это правило должно стоять до того что ты сам написал, но оно тоже кривое поскольку обращение к test тоже удовлетворяет условию и после редиректа на test будет обращение к /index.php.
Кстати ты забыл тут передать значение переменной.
PHP:
RewriteRule ^test/(.+)$ /newtest/indexad.php?variable2=$1  [R=301, L]
 

bob62

Новичок
Можно совсем глупый вопрос?
На локальном сайте (Денвер) вообще не работает RewriteRule.
Вот что есть в .htaccess:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^manual_ikelite_trv.html$ /manuals.html [R]

Я ожидаю, что http://127.0.0.1/manual_ikelite_trv.html будет перенаправляться на http://127.0.0.1/manuals.html
Но вместо этого получается ошибка 404.

Команды RedirectMatch нормально работают, а RewriteRule никак.
Из-за чего такое может быть?
Помогите, пожалуйста.
 

beerdy

Новичок
И еще это правило должно стоять до того что ты сам написал, но оно тоже кривое поскольку обращение к test тоже удовлетворяет условию и после редиректа на test будет обращение к /index.php.
Кстати ты забыл тут передать значение переменной.
PHP:
RewriteRule ^test/(.+)$ /newtest/indexad.php?variable2=$1  [R=301, L]
Чето у меня даже так не хочет работать т.е. сделал так :
Код:
RewriteEngine On
 
RewriteBase /  

Options +FollowSymlinks 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^test/(.+)$ /newtest/indexad.php?variable2=$1  [R=301, L]
При вводе в адресную строку test.ru/test Денвер ругается :Вы ошиблись при наборе URL в браузере. Вероятнее всего, сервер пытается найти файлZ:/home/test.ru/www/test/index.php, которого не существует. Причем папку test переименовал в папку newtest/
 

beerdy

Новичок
Смотри логи апача. И сделай логирование mode_rewrite http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog
А вот когда делаешь вот так
Код:
RewriteRule ^test$ /newtest/indexad.php?variable2=$1  [R=301, L]
а не так
Код:
RewriteRule ^test/(.+)$ /newtest/indexad.php?variable2=$1  [R=301, L]
то все работает!
Может я чего непонимаю как работают вот эти два:
Код:
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
 

Andykalinin

Новичок
А вот когда делаешь вот так
Код:
RewriteRule ^test$ /newtest/indexad.php?variable2=$1  [R=301, L]
а не так
Код:
RewriteRule ^test/(.+)$ /newtest/indexad.php?variable2=$1  [R=301, L]
то все работает!
Я не пойму, тебе переменные нужно передавать или нет? Сделай так
Код:
RewriteRule ^test/(.*)$ /newtest/indexad.php?variable2=$1  [R=301, L]
Может я чего непонимаю как работают вот эти два:
Код:
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
Первое условие проверяет на существование реального файла, а второе на существование директории.
 

bob62

Новичок
Точки экранировать надо в регулярке!!!
Я понял, что я некорректно ставил проблему. Буквально тот модельный код, что я приводил, работает.
Проблема возникает, когда его добавляешь к стандартной части кода Joomla SEF:

PHP:
########## Begin - Joomla! core SEF Section
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
#
########## End - Joomla! core SEF Section
В этом случае RewriteRule
PHP:
RewriteRule ^manual_ikelite_trv\.html$ /manuals.html [R]
перестает работать. Чем это может быть вызвано и как заставить работать переадресацию?
 

beerdy

Новичок
Все. Большое спасибо разобрался.
Я вот на чем запарился:

Вообщем пытался одним редиректом сделать следующие: если просто передается /test то редирект на indexad.php а если два параметра /test/blabla то зпгружается этот самый indexad.php и ему параметр blabla

В итоге сделал так:
Код:
RewriteRule ^test$ /newtest/indexad.php [R=301, L]
RewriteRule ^test/(.*)$ /newtest/indexad.php?variable2=$1  [R=301, L]
 
Сверху