Вы можете создать универсальное правило перезаписи для 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
для подпапки, которая проверяет, были ли мы уже перезаписаны или нет?)
... но если вы добавите файл с именем
/ 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
содержит первую строку заголовка начального запроса и не изменяется при перезаписи запроса.