Помочь разобраться в .htaccess

Белый Ум
На сайте с 27.04.2009
Offline
251
1093

Добрый день. Не получается через файл .htaccess реализовать редирект 301.

Обычно я делаю так:


RewriteEngine on
RewriteRule \.[a-zA-Z]+/old/adres/$ http://www.site.ru/new/ [R=301,L]

RewriteRule (.*)$ /index.php/$1 [L]

Но на одном сайте идет какая-то хитрая передача управления файлам админки, и мой код конфликтует:

RewriteEngine on

RewriteRule \.[a-zA-Z]+/old/adres/$ http://www.site.ru/new/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^(.+)$ index.php?section=$1 [QSA]

- этот код не срабатывает.

Что значат все команды которые передают управление админке, и как писать в этом файле редиректы в привычном мне виде?

Заранее спасибо.

Skype: shum_beliy
siv1987
На сайте с 02.04.2009
Offline
427
#1

Пишите свои "привычные" редиректы перед правилами реврайта админки. Дело может быть не какой-то "хитрой передаче", а в "привычной" форме которая привычной по определению не может быть. Кстати ваш шаблон соответствует чему-то таким *.php/old/adres/

Белый Ум
На сайте с 27.04.2009
Offline
251
#2
siv1987:
Пишите свои "привычные" редиректы перед правилами реврайта админки. Дело может быть не какой-то "хитрой передаче", а в "привычной" форме которая привычной по определению не может быть. Кстати ваш шаблон соответствует чему-то таким *.php/old/adres/

Именно так я пишу - посмотрите на второй вариант кода. Там редирект перед правилами админки. Но этот вариант не работает. Если закоментировать передачу управления админке, то редирект срабатывает, но понятное дело, сам сайт падает.

*.php/old/adres/

- вы правы это правило захватывает только domen.ru/old/adres/ domen.com/old/adres/ domen.net/old/adres/

Я прописывают так, потому что правило /old/adres/ редиректит также страницы domen.ru/xxxx/old/adres/ , а это не то что мне нужно.

S
На сайте с 05.04.2013
Offline
19
#3

Вот так вроде должно работать:


RewriteEngine on
RewriteRule ^old/adres/$ new/adres/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^(.+)$ index.php?section=$1 [QSA]

old/adres и new/adres замените на то что нужно

siv1987
На сайте с 02.04.2009
Offline
427
#4
Белый Ум:
- вы правы это правило захватывает только domen.ru/old/adres/ domen.com/old/adres/ domen.net/old/adres/

Она не может захватывать, потому что в rewriteRule вообще не может быть .ru HTTP_HOST-а.

Белый Ум:
Я прописывают так, потому что правило /old/adres/ редиректит также страницы domen.ru/xxxx/old/adres/ , а это не то что мне нужно.

Для этого существуют маркеры начало и конца строки - ^$

^old/adres/$

Белый Ум
На сайте с 27.04.2009
Offline
251
#5
Она не может захватывать, потому что в rewriteRule вообще не может быть .ru HTTP_HOST-а.

Но у меня же так работает!

хотите покажу пример?

RewriteRule \.[a-zA-Z]+/old/adres/$ http://www.site.ru/new/ [R=301,L]

Вот такой код переадресовывает htttp://domen.ru/old/adres/ по адресу http://www.site.ru/new/ а адрес htttp://domen.ru/xxx/old/adres/ не переадресовывает(что собственно мне и нужно!)

Для этого существуют маркеры начало и конца строки - ^$
^old/adres/$

Я регулярки знаю гораздо лучше чем всякие RewriteRule и RewriteCond но символ ^(начало данных) почему-то не работает!

Т.е. когда я прописываю

RewriteRule ^old/adres/$ new/ [R=301,L]

То переадресация происходит не только по адресу htttp://domen.ru/old/adres/ но и по адресу htttp://domen.ru/xxx/old/adres/

---------- Добавлено 12.04.2013 в 23:55 ----------

P.S. Написал в личку с примерами того что начальный ^ не учитывается и то что HTTP_HOST учитывается регуляркой.

siv1987
На сайте с 02.04.2009
Offline
427
#6
Белый Ум:
Но у меня же так работает!

Если у вас так срабатывает, не означает что так должно быть. Если не работает ^old/adres/$ значит у вас в rewriteRule попадает не стандартный адрес (такое например может быть если используются динамические поддомены через htaccess). Можете сделать проверочный реврайт на левый файл file.php - RewriteRule (.*) file.php?rule=$1 [L] и посмотреть что там находиться. Тогда уже можно будет составить подходящий шаблон.

---------- Добавлено 12.04.2013 в 23:10 ----------

Белый Ум:
То переадресация происходит не только по адресу htttp://domen.ru/old/adres/ но и по адресу htttp://domen.ru/xxx/old/adres/

А сама кмс не может например сделать такой редирект? Я честно не вижу причин почему он должен срабатывать...

Белый Ум
На сайте с 27.04.2009
Offline
251
#7
siv1987:


А сама кмс не может например сделать такой редирект? Я честно не вижу причин почему он должен срабатывать...

Да это сама цмс. Поймал ошибку. Индусы.

---------- Добавлено 13.04.2013 в 00:18 ----------


(Далее речь идет уже о другом сайте, на котором не эта ЦМС с ошибкой.)

Если у вас так срабатывает, не означает что так должно быть. Если не работает ^old/adres/$ значит у вас в rewriteRule попадает не стандартный адрес (такое например может быть если используются динамические поддомены через htaccess). Можете сделать проверочный реврайт на левый файл file.php - RewriteRule (.*) file.php?rule=$1 [L] и посмотреть что там находиться. Тогда уже можно будет составить подходящий шаблон.

я не очень понял, что вы имеете ввиду - я сделал файл file.php:

<?php
print_r($_GET);
?>

и добавил редирект

RewriteRule (.*) file.php?rule=$1 [L]

и вот что я вижу по любому адресу (например по domen.ru/vasya_pupkin/):

Array ( [rule] => file.php )

Что это означает??

siv1987
На сайте с 02.04.2009
Offline
427
#8
Белый Ум:
и добавил редирект
и вот что я вижу по любому адресу (например по domen.ru/vasya_pupkin/):

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteRule (.*) file.php?rule=$1 [L]

Белый Ум
На сайте с 27.04.2009
Offline
251
#9

Я добавил в самый верх файла такие строки:

RewriteEngine on


RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) file.php?rule=$1 [L]

и теперь вообще никаких редиректов не поисходит. Т.е. %{ENV:REDIRECT_STATUS} ^$ это никогда не верно. Что мы получили?

siv1987
На сайте с 02.04.2009
Offline
427
#10

Это означает что где-то используются реврайты, и перед этими правилами что-то отрабатывает.

RewriteCond %{ENV:REDIRECT_STATUS} ^$

замените на

RewriteCond %{REQUEST_FILENAME} !file\.php

или на RewriteCond %{REQUEST_URI} !file\.php

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий