Назад | Перейти на главную страницу

Правило перезаписи всех адресов для 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 для подпапки, которая будет проверять, были ли мы уже переписаны или нет?)

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