У меня есть домен, выделенный для моего локального сервера (.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:
http://folder.dev/folder/
.http://folder.dev/
.Но если вы сделаете это, то не сможете получить доступ к таким путям, как /htdocs/folder/folder/
, где первый элемент пути действительно совпадает с именем поддомена.
Учитывая это, вы не можете решить эту проблему с помощью только .htaccess и mod_rewrite.
Другие решения: