Что не так с моим RewriteRule через .htaccess? (Зачем это нужно RewriteBase?) - PullRequest
6 голосов
/ 26 января 2010
rewriteengine on
rewriterule ^/a/b$ ^/c$

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

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

работает.

Ответы [ 2 ]

11 голосов
/ 26 января 2010

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

RewriteRule ^/?a/b$ c

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

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

Edit: Как упомянуто в технических подробностях 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-адрес затем повторно вводится как подзапрос.

1 голос
/ 26 января 2010

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

RewriteEngine On    
RewriteRule ^/$ /blog/ [R]
RewriteRule ^/wordpress/(.*) /blog/$1 [R]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...