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

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

не работа, но

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

работы.

6
задан Simon East 4 June 2015 в 02:28
поделиться

2 ответа

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

RewriteRule ^/?a/b$ c

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

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

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

11
ответ дан 9 December 2019 в 20:43
поделиться

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

RewriteEngine On    
RewriteRule ^/$ /blog/ [R]
RewriteRule ^/wordpress/(.*) /blog/$1 [R]
1
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: