Назад | Перейти на главную страницу

.htaccess - имитация неправильной ссылки виртуального хоста на родительский каталог в списке каталогов

У меня есть домен, выделенный для моего локального сервера (.dev), и файл .htaccess, который перенаправляет такие запросы, как http://folder.dev/subfolder/ к /htdocs/folder/subfolder. Он отлично работает и все, за исключением одной незначительной проблемы. Когда у меня включен список каталогов, я могу получить доступ ко всем папкам, подпапкам и файлам должным образом, за исключением случаев, когда я нажимаю кнопку Parent Directory ссылка, которая, например, должна вести на http://folder.dev, но перенаправляет на http://folder.dev/folder/ и, следовательно, бросает 404 not found. Аналогично, если Parent Directory должен ссылаться на http://folder.dev/subfolder/, он ссылается на http://folder.dev/folder/subfolder/. Вот как выглядит мой .htaccess:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
RewriteCond %{ENV:REDIRECT_SUBDOMAIN} =""
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9][-a-z0-9]+)\.dev\.?(:80)?$ [NC]
RewriteCond %2 !^www|ftp|mail|pop3|localhost$
RewriteCond %{DOCUMENT_ROOT}/%2 -d
RewriteRule ^(.*) %2/$1 [E=SUBDOMAIN:%2,L]
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN}]

Помимо этого, все остальное работает нормально (например, относительные ссылки в документах и ​​т. Д.)

Это происходит потому, что когда Apache показывает индекс каталога, он оценивает ссылку «Родительский каталог» в зависимости от DocumentRoot виртуального хоста и текущего каталога.

Я думаю, ты используешь /htdocs каталог, который будет корнем документа folder1.dev, folder2.dev и все другие домены .dev, и вы размещаете свой .htaccess прямо в /htdocs/.htaccess.

Когда вы идете в http://folder.dev/subfolder/ (корень документа /htdocs/), ваш .htaccess показывает вам /htdocs/folder/subfolder/ вместо. Относительный путь от корня документа до этого каталога: folder/subfolder. Когда Apache вычисляет ссылку на родительский каталог для каталога, который он в настоящее время отображает, он принимает http:// + folder.dev + dirname('folder/subfolder'), что, конечно, равно http://folder.dev/folder/, а НЕ только http://folder.dev/ как и следовало ожидать.

Можно было бы проверить в .htaccess, если первый элемент пути после имени домена равен субдомену и перенаправить на root:

  1. У нас есть http://folder.dev/folder/.
  2. Мы видим, что «папка» (поддомен) == «папка» (1-й элемент пути).
  3. Перенаправить на http://folder.dev/.

Но если вы сделаете это, то не сможете получить доступ к таким путям, как /htdocs/folder/folder/, где первый элемент пути действительно совпадает с именем поддомена.

Учитывая это, вы не можете решить эту проблему с помощью только .htaccess и mod_rewrite.

Другие решения:

  1. Используйте vitrual host для любой папки, к которой вы хотите получить доступ. Магия .htaccess не требуется. Конфиги Vhost могут быть сгенерированы из списка папок. Наиболее гибкое решение, так как можно создавать любые хосты с любыми параметрами конфигурации для любых папок, где бы они ни находились.
  2. Использовать mod_vhost_alias. Проще, не требует навыков написания сценариев, но может потребоваться изменение наименования папок для автоматического преобразования между именем папки и каталогом-документа.
  3. Использовать HeaderName в .htaccess, чтобы добавить заголовок ко всем страницам индекса. Используйте jQuery, чтобы изменить ссылку на родительский каталог любым способом. Похоже на грязный прием, но все же будет работать.