htaccess: редирект подкаталога в корень

S2
На сайте с 29.09.2009
Offline
35
7472

Добрый день, подскажите как сделать редирект корневых запросов из подкаталога в корень сайта.

А именно:

У сайта есть подкаталог /shop

Нужно 2 запроса /shop и /shop/index.php перенаправлять на корень сайта. Любые другие запросы в подкаталог должны оставаться как есть. Любые запросы в корень сайта или другие подкаталоги тоже должны оставаться без изменений.

Сейчас в htaccess есть 2 правила:

# склейка зеркала

RewriteCond %{HTTP_HOST} !^www.mysite.com [NC]

RewriteRule ^(.*) http://www.mysite.com/$1 [L,R=301]

# редирект index.php на корень

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/

RewriteRule ^index\.php$ http://www.mysite.com/$1 [R=301,L]

Alex Klo
На сайте с 15.06.2006
Offline
304
#1

RewriteCond %{HTTP_HOST} ^site.ru$ [NC]

RewriteRule ^(.*)$ http://site.ru/dir/$1 [R=301,L]

Проверка и мониторинг позиций сайта ( http://www.topvisor.ru/?inv=1520 ) Продвигаю сайты http://climat-nw.ru/conditioner-installation/ http://www.aircom-spb.ru/service/montaj/
S2
На сайте с 29.09.2009
Offline
35
#2

У меня данное правило делает циклический редирект.

Т.е. независимо от того, куда я захожу: site.ru или site.ru/shop

я получаю http://site.ru/shop/shop/shop/.../shop/

zhitov
На сайте с 30.01.2005
Offline
219
#3

Если 301 редирект

RewriteRule ^shop\/$ shop\/index.php [R=301,L]

RewriteRule ^shop\/index.php$ shop\/index.php [R=301,L]

или если не перенаправлять, а исполнять

RewriteRule ^shop\/$ shop\/index.php [L]

RewriteRule ^shop\/index.php$ shop\/index.php [L]

Надо еще добавить в начало RewriteBase /

Строительные калькуляторы ( https://www.zhitov.com/ )
Alex Klo
На сайте с 15.06.2006
Offline
304
#4
sava2000:
У меня данное правило делает циклический редирект.

у меня там разные домены, поэтому нет такого... :)

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

Снова этот shop... После RewriteEngine

RewriteRule ^shop/(index.php)?$ / [R=301,L]

zhitov, слеш не является спец символом, его не надо экранировать, тем более в не regexp строке кой является substitution

S2
На сайте с 29.09.2009
Offline
35
#6
siv1987:
Снова этот shop... После RewriteEngine
RewriteRule ^shop/(index.php)?$ / [R=301,L]

да, но при этом все адреса вида

http://site.com/shop/index.php?action=pages.getPage&Id=65

также редиректятся в корневой каталог

http://site.com/?action=pages.getPage&Id=65

Как избежать этого?

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

RewriteRule ^shop/(index.php)?$ /? [R=301,L]

S2
На сайте с 29.09.2009
Offline
35
#8

Не, это не то.

Это вообще любые адреса в каталоге /shop, которые начинаются с index.php редиректит в корень.

Я неправильно объяснил.

Все адреса внутри раздела /shop должны остаться и обрабатываться как раньше.

Т.е. адреса вида http://site.com/shop/index.php?actio....getPage&Id=65

должны продолжать обрабатываться по этим адресам.

Аналогичные адреса в корневой директории также должны остаться. Т.е.

http://site.com/index.php?actio....getPage&Id=65 остается доступен в прежнем виде

И только

- /shop

- /shop/index.php

- index.php

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

-----------------------

правило

RewriteRule ^shop/(index.php)?$ / [R=301,L]

делает то, что нужно, но дополнительно редиректит все index.php?actio....getPage&Id=65 в корень с сохранением всех параметров

RewriteRule ^shop/(index.php)?$ /? [R=301,L]

редиректит все подобные адреса на главную сайта

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

Про QUERY_STRING параметры надо было сразу сказать, и сказать это внятно.

Редиректить

- /shop/

- /shop/index.php

Не редиректить

- /shop/index.php?actio....getPage&Id=65

RewriteCond %{QUERY_STRING} ^$

RewriteRule ^shop/(index.php)?$ /? [R=301,L]

S2
На сайте с 29.09.2009
Offline
35
#10

Да, виноват.

Спасибо, все работает.

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