В Apache, как сделать внешнее перенаправление на версию URL-адреса без косой черты с файлом подпапки .htaccess

В 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, но я предполагаю, что это не имеет значения здесь.

Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
0
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
RewriteRule ^(.*)/ $1 [R=302,L]

Вам не хватает префикса косой черты (/) в строке замена (2-й аргумент), чтобы сделать замену относительно корня. Вернее, /subfolder/ (поскольку этот .htaccess файл находится в подпапке). Поскольку это строка подстановки относительный (не начинающаяся с косой черты или схемы + имени хоста), префикс каталога*1 (который, как я предполагаю, /fs9e/username/sub/public/path/) добавляется обратно (по умолчанию*2), что приводит к неправильному перенаправлению. (Это верно для внутренней перезаписи, но не для внешней переадресации.)

Это должно быть так:

RewriteRule ^(.*)/$ /subfolder/$1 [R=302,L]

Обратите внимание, что вам также не хватало якоря конца строки ($) на RewriteRuleшаблон. (Это также устраняет необходимость в предыдущем состояние, который проверяет, заканчивается ли REQUEST_URI косой чертой.)

Также обратите внимание, что это «перенаправление» должно идти до более ранней «перезаписи».


*1 The directory-prefix is the absolute filesystem path of the location of the .htaccess file.

*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!

halloleo 06.04.2022 11:07

Другие вопросы по теме