Правило перезаписи всех адресов для apache, которое не приводит к дублированию URL-адресов из .htaccess

Вы можете создать универсальное правило перезаписи для apache, которое действует как псевдоним, но может быть реализован в файле .htaccess , а псевдоним не может.

В качестве примера предположим, что корень вашего документа представляет собой иерархию, подобную этой:

/.htaccess
/test/
/test/.htaccess
/test/file

Вы можете "Псевдоним" для всех запросов к тестовая папка, сделав корневой .htaccess содержащий:

RewriteEngine On
RewriteRule ^(.*)$ /test/$1 [L]

А второй .htaccess содержащий:

RewriteEngine On

Это отлично работает, и обычно это все, что вам нужно. У него только одна проблема - он создает несколько действительных URL-адресов. Теперь вы можете получить доступ к файлу с помощью / file и / test / file .

Обычно это не проблема, но если вы добавите файл с именем / test / test вы увидите проблему, так как поддельный псевдоним полностью перестает работать. Если подпапка содержит собственный сложный .htaccess , это может вызвать серьезные головные боли.

Есть ли способ подделать псевдоним из .htaccess , если исходные URL-адреса еще не работают? (Любой RewriteCond для подпапки, которая проверяет, были ли мы уже перезаписаны или нет?)

3
задан 20 May 2017 в 23:41
1 ответ

... но если вы добавите файл с именем / test / test , вы увидите проблему, так как поддельный псевдоним полностью перестанет работать.

Да, второй ] .htaccess файл в подкаталоге предотвращает перезапись URL-адреса (поскольку мод-перезапись по умолчанию не наследуется). Вы можете обойти это, просто имея один файл .htaccess в корне документа, который перезаписывает все запросы, которые еще не были перезаписаны. Например:

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /test/$1 [L]

Переменная среды REDIRECT_STATUS пуста при первоначальном запросе и имеет значение 200 (OK) после первой успешной перезаписи.

Однако, если вы все еще требуется файл .htaccess в подкаталоге (для других директив mod_rewrite), тогда вам нужно либо:

  • повторить эти директивы в подкаталогах .htaccess файл. (Тогда вам не понадобится указанная выше директива RewriteCond в родительском файле .htaccess .)

  • Или включите наследование mod_rewrite. Но я думаю, что вы будете бороться с Apache 2.2. Вам, вероятно, понадобится что-то вроде RewriteOptions InheritBefore (в подкаталогах .htaccess файл), который доступен только в Apache 2.4.

У него только одна проблема - он создает несколько допустимых urls.

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


В противном случае вы бы необходимо убедиться, что базовый подкаталог был уникальным, чтобы иметь возможность реализовать каноническое перенаправление обратно в корень документа, если к базовому подкаталогу обращались напрямую. Например:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /unique-subdir
RewriteRule (.*) /$1 [R=301,L]

THE_REQUEST содержит первую строку заголовка начального запроса и не изменяется при перезаписи запроса.

1
ответ дан 3 December 2019 в 07:23

Теги

Похожие вопросы