В Apache 2.4 у меня есть .htaccess (в подпапке), который переписывает запросы без косой черты внутри этой папки в соответствующие индексные файлы:
DirectorySlash Off
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule (.*) $1/index.html [L]
Это работает для версии без косой черты точно так, как ожидалось. Теперь я хочу перенаправить версию с косой чертой извне на версию без косой черты. Пробовал добавлять строки:
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} /$
RewriteRule ^(.*)/ $1 [R=302,L]
Однако это не работает: перенаправление выдается, однако оно переходит не на URL-адрес без косой черты, а на URL-адрес с введенной частью, специфичной для системы.
Итак, для примера URL-адреса http://example.com/path/to/dir/
URL-адрес перенаправления выглядит так http://example.com/fs9e/username/sub/public/path/to/dir
, а не просто http://example.com/path/to/dir
.
Как я могу это исправить? Большое спасибо за любые указатели!
PS: Реальный случай немного сложнее, потому что я перезаписываю субдомен в папку в корневом .htacces, но я предполагаю, что это не имеет значения здесь.
RewriteRule ^(.*)/ $1 [R=302,L]
Вам не хватает префикса косой черты (/
) в строке замена (2-й аргумент), чтобы сделать замену относительно корня. Вернее, /subfolder/
(поскольку этот .htaccess
файл находится в подпапке). Поскольку это строка подстановки относительный (не начинающаяся с косой черты или схемы + имени хоста), префикс каталога*1 (который, как я предполагаю, /fs9e/username/sub/public/path/
) добавляется обратно (по умолчанию*2), что приводит к неправильному перенаправлению. (Это верно для внутренней перезаписи, но не для внешней переадресации.)
Это должно быть так:
RewriteRule ^(.*)/$ /subfolder/$1 [R=302,L]
Обратите внимание, что вам также не хватало якоря конца строки ($
) на RewriteRule
шаблон. (Это также устраняет необходимость в предыдущем состояние, который проверяет, заканчивается ли REQUEST_URI
косой чертой.)
Также обратите внимание, что это «перенаправление» должно идти до более ранней «перезаписи».
*2 The alternative is to set a RewriteBase /subfolder
- but that then affects all relative substitutions. You could also use an environment variable to apply a specific prefix only to some rules.
Это работает отлично! Приятно знать, что мне нужно сделать это абсолютной заменой. Большое спасибо @MrWhite!