Надеюсь, я упустил что-то глупое.
Я пытаюсь перенаправить URL-адреса, используя.htaccess на Apache 2.2, используя патч PHP 5.4 на бесплатном хостинге OpenShift.
Это соответствует URI/permalink/a123 (обратите внимание на отсутствие ведущей косой черты в шаблоне фильтра правил):
RewriteEngine On
RewriteRule permalink/a.*$ /permalink/b [R=301,L]
Это не соответствует URI/permalink/a123 (обратите внимание на косую черту в шаблоне фильтра правил):
RewriteEngine On
RewriteRule /permalink/a.*$ /permalink/b [R=301,L]
Итак, какая глупость у меня есть?
Благодарю.
URI, используемый для сопоставления шаблонов в RewriteRule
, канонизируется в контексте для каждого каталога (либо в файле htaccess, либо в контейнере <Directory>
), удаляя ведущий /
. Поэтому, если запрашиваемый URL-адрес:
http://example.com/web/permalink/123
И из файла htaccess в корневом каталоге документа URI, используемый для соответствия правилам, является web/permalink/123
. Но в файле htaccess в web
папке URI является permalink/123
и т.д.
Таким образом, вы не можете создавать свои шаблоны с помощью /
поскольку они удаляются из URI в контексте файла htaccess.
RewriteBase
не влияет на косую черту в шаблоне правила перезаписи, она влияет на цель правила (добавляет базу к относительным целям). Разница, вероятно, в RewriteRule /foo
против RewriteRule ^/foo
. Первый соответствует любому /foo
любом месте URI, второй имеет ^
и соответствует только началу URI, и потерпит неудачу, потому что начало не имеет /
.
RewriteBase /
чтобы изменить базовое местоположение, к которому применяется правило.