Вы можете создать универсальное правило перезаписи для 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
(ОК) после первой успешной перезаписи.
Однако если вы все еще необходимость а .htaccess
файл в подкаталоге (для других директив mod_rewrite), то вам либо нужно:
повторите эти директивы в подкаталогах .htaccess
файл. (Тогда вам не понадобится строго указанное выше RewriteCond
директива в родительском .htaccess
файл.)
Или включите наследование mod_rewrite. Но я думаю, что вы столкнетесь с проблемами на Apache 2.2. Вам, вероятно, понадобится что-то вроде RewriteOptions InheritBefore
(в подкаталогах .htaccess
file), который доступен только в Apache 2.4.
У него только одна проблема - он создает несколько действительных URL-адресов.
Вышеупомянутый метод также решает эту проблему, поскольку все запросы теперь переписываются (что больше похоже на то, как Apache Alias
будет вести себя в конфигурации сервера).
В противном случае вам нужно будет убедиться, что базовый подкаталог был уникальным, чтобы иметь возможность реализовать каноническое перенаправление обратно в корень документа, если к базовому подкаталогу обращались напрямую. Например:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /unique-subdir
RewriteRule (.*) /$1 [R=301,L]
THE_REQUEST
занимает первую строку начальный заголовок запроса и не изменяется при перезаписи запроса.