.htaccess слэш меняет вид адресной строки?

-D
На сайте с 04.03.2006
Offline
82
3093

есть домен и он указывает на общую глобальную папку на обычном хостинге.

в этой глобальной папке есть .htaccess , где прописано чтобы этот домен направлялся в директорию DIR:

RewriteCond %{ENV:REDIRECT_MYFLAG} ^$

RewriteCond %{HTTP_HOST} ^www\.домен\.ru$

RewriteRule ^(.+) %{HTTP_HOST}$1 [E=MYFLAG:1]

RewriteRule ^www\.домен\.ru(.*) /DIR%{REQUEST_URI} [L]

Обращение к домену, происходит правильно, точнее перенаправление в директорию.

Внутри директории DIR , есть поддиректория DIR1, в ней лежит индекс.пхп

в чём проблема:

Когда мы запрашиваем поддиректорию этого домена:

www.домен.ру/DIR1/ то всё ок, но если мы уберём слэш, после DIR1, типа:

www.домен.ру/DIR1

то в строке браузера мы увидим, не www.домен.ру/DIR1/ , а www.домен.ру/DIR/DIR1/

т.е. почему-то показывается основная папка домена DIR, хотя она никому показываться не должна.

Где-то флаг надо поставить или в чём может быть проблема?

gormarket
На сайте с 29.12.2010
Offline
47
#1

Перед теми строками, что Вы привели добавьте строку редиректа на адрес со слешем:


RewriteRule ^DIR1$ /DIR1/ [NC,R=301,L]
Товары и цены в магазинах Вашего города: Городской рынок (http://gormarket.ru/)
-D
На сайте с 04.03.2006
Offline
82
#2

получается если папок 10 штук, все прописывать?

пока что решение видится такое, и не в глобальный хтаксес, а в хтаксес который находится ВНУТРИ папки DIR. (т.е. папка этого домена)

RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?)

RewriteRule .* %1/ [L]

добавляет слэш, после любой папки. как такое решение?

gormarket
На сайте с 29.12.2010
Offline
47
#3
-=Den=-:
получается если папок 10 штук, все прописывать?

Если всего десяток и предполагается что папки не будут активно плодиться, то не проблема и для каждой прописать свой редирект. Некоторые пишут сотни строк.

-=Den=-:

RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?)
RewriteRule .* %1/ [L]

добавляет слэш, после любой папки. как такое решение?

Не очень.

У Вас реврайт, а не редирект.

Получается что по двум адресам (со слэшем и без) будет получаться одинаковое содержимое, т.е. будут дубликаты страниц.

Лучше все-таки сделать 301 редирект, и с проверкой, что папка существует в директории DIR


RewriteCond %{REQUEST_URI} (.*/)([^/.]+)($|\?)
RewriteCond %{DOCUMENT_ROOT}%1DIR/%2 -d
RewriteRule .* %1%2/ [NC,R=301,L]

Если адрес заканчивается строкой (не содержащей точек и слэшей) или после этой строки идет знак вопроса

+

Если эта строка является поддиректорией директории DIR

=

Выполняется 301 редирект на тот же адрес с добавлением слэша

-D
На сайте с 04.03.2006
Offline
82
#4

благодарю за помощь!)

насчет того что будут дубликаты страниц, со слэшем и без - дело в том, по всей видимости Яндекс не видит index.php при обращении к подпапкам домена - DIR1,DIR2 и тд. т.к. в панеле вебмастера, все эти директории выкинуты как 404. Хотя через браузер всё ок.

А на эти директории с главной страницы домена, стоят ссылки типа: a href=/DIR1/> а не a href=/DIR1/index.php. т.е. ссылки без индекса.

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

siv1987
На сайте с 02.04.2009
Offline
427
#5
А из-за вообще такая проблема, что если не указывать слэш после директории, то зачем-то в адресной строке показывается папка DIR, т.е. папка основного домена. Это так и положено или сервер криво настроен?

Это потому что происходит внешний редирект уже реврайтного урла так как к папке отсутствует закрывающий слэш. / => ..searchengines.ru/

gormarket
На сайте с 29.12.2010
Offline
47
#6
-=Den=-:

Это так и положено или сервер криво настроен?

Наверно так положено (есле не принять каких-то специальных мер).

Например в сети есть следующее:


... почти всегда на Apache ставится модуль mod_dir, который открывает файл index.php при обращении к папке, его содержащей...

и еще:


... особенность работы модуля mod_dir, при которой если происходит запрос файла, являющегося директорией, но запрос не оканчивается знаком слэш, то mod_dir осуществляет внешнюю переадресацию на тот же адрес со знаком слэша в конце.

т.е. проблема, возникшая перед Вами вызвана тем, что .htaccess (при некоторых условиях) делает внутреннюю переадресацию (добавляя в середину адреса директорию DIR, но не проверяя при этом наличия слэша в конце адреса, и не добавляя его при необходимости)

а затем (если не хватает слэша) начинает действовать mod_dir, делая внешний редирект на измененный в .htaccess адрес с добавлением слеша (и показывая пользователю что на самом деле все лежит в DIR)

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