Что случилось с моим RewriteRule через .htaccess? (Зачем нужен RewriteBase?)

rewriteengine on
rewriterule ^/a/b$ ^/c$

не работает, но

rewriteengine on
rewritebase /
rewriterule ^a/b$ ^c$

работы.

Ответ 1

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

RewriteRule ^/?a/b$ c

При применении RewriteRule из .htaccess ведущая косая черта будет удалена из URL-адреса, что приведет к сбою шаблона, если вы включите его. Запустив шаблон с помощью "^/?", Он будет работать в основных файлах конфигурации и в файлах конфигурации каждого каталога.

Прочитайте подробную документацию mod_rewrite, чтобы узнать, как работает механизм перезаписи и значение RewriteBase.

Изменить: Как упоминалось в mod_rewrite технические детали и описано в документации для RewriteRule и RewriteBase, URL-адрес был переведен на путь к моменту проверки правил перезаписи каталога. У механизма перезаписи больше нет URL-адреса для работы. Вместо этого он удаляет префикс локального каталога (каталог, содержащий файл .htaccess), который заканчивается косой чертой. Например, предположим, что посетитель запрашивает "/var/www/foo/bar/baz.html", и существует правило перезаписи, установленное в "/var/www/foo/.htaccess". Перед каждым правилом, механизм перезаписи разделит "/var/www/foo/", оставив "bar/baz.html" для соответствия правилам перезаписи. После обработки правила префикс локальной папки добавляется (если только замена не начинается с "http://" ). После того как все правила перезаписи были обработаны, база перезаписи, если установлена, заменяет префикс локального каталога; если нет, то корень документа лишается. Затем перезаписанный URL-адрес повторно вводится как подзапрос.

Ответ 2

Какую версию Apache вы используете? RewriteBase не требуется, если вы переписываете его из корня. Если вы этого не сделаете, вам может понадобиться. Например, часть моих текущих конфигураций (Apache 2.2) для одного из моих блогов выглядит следующим образом и работает:

RewriteEngine On    
RewriteRule ^/$ /blog/ [R]
RewriteRule ^/wordpress/(.*) /blog/$1 [R]