Я видел это в нескольких .htaccess
примерах
RewriteBase /
Похоже, что-то похоже на функциональность <base href="">
HTML.
Я полагаю, что он может автоматически добавлять значение к началу RewriteRule
операторов (возможно, без косой черты)?
Я не мог заставить это работать должным образом. Я думаю, что его использование может пригодиться для переносимости сайта, так как у меня часто есть сервер разработки, который отличается от производственного сервера. Мой текущий метод оставляет мне удаление частей из моих RewriteRule
заявлений.
Может кто-нибудь объяснить мне кратко, как это реализовать?
Спасибо
.htaccess
mod-rewrite
Алекс
источник
источник
Ответы:
По моим собственным словам, после прочтения документов и экспериментов:
Вы можете использовать,
RewriteBase
чтобы обеспечить базу для ваших переписывает. Учти этоЭто реальное правило, которое я использовал, чтобы убедиться, что URL-адреса имеют косую черту. Это преобразует
в
Имея
RewriteBase
там, вы делаете относительный путь отRewriteBase
параметра.источник
$1
совпадает с шаблоном RewriteRule , заключенным в скобки, но относительный путь для подстановки определяется параметром RewriteBase. Итак, итоговая замена есть/~new/$1/
.RewriteBase
директивах. Короче говоря, вы не можете иметь больше одного - я думаю, что последняяRewriteBase
директива побеждает и влияет на весь файл .htaccess.RewriteBase
чтобы обеспечить основу для переписывания» - это в значительной степени просто перестановка слов - но я понятия не имею , что такое «база» находится в этом контексте, ни то, как смысл приведенный вами пример будет отличаться, еслиRewriteBase
строка будет удалена. Прочь к руководству, я иду ...RewriteBase
применяется только к мишени о наличии относительного правила перезаписи.Используя RewriteBase, как это ...
по сути то же самое, что и ...
Но когда файл .htaccess находится внутри,
/folder/
это также указывает на ту же цель:Хотя документы подразумевают всегда использование a
RewriteBase
, Apache обычно правильно определяет его для путей в DocumentRoot, если только:Вы используете
Alias
директивыВы используете правила перезаписи .htaccess для выполнения перенаправления HTTP (а не просто перезаписи без вывода сообщений) на относительные URL
В этих случаях вы можете обнаружить, что вам нужно указать RewriteBase.
Тем не менее, поскольку это непонятная директива, обычно лучше просто указывать абсолютные (иначе называемые «коренные родственники») URI в целях перезаписи. Другие разработчики, читающие ваши правила, поймут это легче.
Цитата из превосходного подробного ответа Джона Линя здесь :
В файле htaccess mod_rewrite работает аналогично контейнеру
<Directory>
или<Location>
. иRewriteBase
используется для обеспечения базы относительного пути.Например, скажем, у вас есть эта структура папок:
Таким образом, вы можете получить доступ к:
http://example.com/
(Корень)http://example.com/subdir1
(Subdir1)http://example.com/subdir2
(Subdir2)http://example.com/subdir2/subsubdir
(Subsubdir)URI, который отправляется через a,
RewriteRule
относится к каталогу, содержащему файл htaccess. Так что если у вас есть:/a/b/c/d
, тогда захваченный URI ($1
) естьa/b/c/d
.subdir2
и запрос -/subdir2/e/f/g
тогда захваченный URIe/f/g
.subsubdir
, а запрос -/subdir2/subsubdir/x/y/z
записанный URIx/y/z
.В каталоге, в котором находится правило, эта часть удалена из URI. База переписывания не влияет на это, это просто, как работает для каждого каталога.
Что делает база перезаписи , так это предоставляет базу URL-путей ( не базу файловых путей) для любых относительных путей в целевом объекте правила . Скажем так, у вас есть это правило:
Это
bar.php
относительный путь, в отличие от:где
/bar.php
абсолютный путь. Абсолютный путь всегда будет «корневым» (в структуре каталогов выше). Это означает, что независимо от того, находится ли правило в «root», «subdir1», «subsubdir» и т. Д.,/bar.php
Путь всегда отображается наhttp://example.com/bar.php
.Но другое правило, с относительным путем, оно основано на каталоге, в котором находится правило. Так что если
находится в «корне», и вы идете
http://example.com/foo
, вы обслуженыhttp://example.com/bar.php
. Но если это правило находится в каталоге «subdir1», и вы переходите к немуhttp://example.com/subdir1/foo
, вы получаете обслуживаниеhttp://example.com/subdir1/bar.php
. и т. д. Иногда это работает, а иногда нет, как говорится в документации, это требуется для относительных путей, но в большинстве случаев это работает. За исключением случаев, когда вы перенаправляете (используяR
флаг или неявно, потому что у вас естьhttp://host
цель вашего правила). Это означает, что это правило:если он находится в директории «subdir2», и вы идете
http://example.com/subdir2/foo
, mod_rewrite ошибется относительный путь в качестве файлового пути вместо URL-путь и из-заR
флаг, вы в конечном итоге получить перенаправлены на что - то вроде:http://example.com/var/www/localhost/htdocs/subdir1
. Что, очевидно, не то, что вы хотите.Вот где
RewriteBase
приходит. Директива говорит mod_rewrite, что добавлять в начало каждого относительного пути. Так что если у меня есть:в «субсубдире», собираясь на
http://example.com/subdir2/subsubdir/foo
самом деле будет служить мнеhttp://example.com/blah/bar.php
. «Bar.php» добавляется в конец базы. На практике этот пример обычно не тот, который вы хотите, потому что вы не можете иметь несколько баз в одном контейнере каталога или файле htaccess.В большинстве случаев он используется так:
где эти правила будут в каталоге "subdir1" и
будет в каталоге "subsubdir".
Это частично позволяет вам сделать ваши правила переносимыми, так что вы можете отбросить их в любой каталог, и вам нужно всего лишь изменить базу вместо набора правил. Например, если у вас было:
такие, которые
http://example.com/subdir1/foo
будут служитьhttp://example.com/subdir1/bar.php
и т. д. И скажем, вы решили переместить все эти файлы и правила в каталог «subsubdir». Вместо того, чтобы менять каждый экземпляр/subdir1/
на/subdir2/subsubdir/
, вы могли бы просто иметь базу:И затем, когда вам нужно было переместить эти файлы и правила в другой каталог, просто измените базу:
и это все.
источник
RewriteEngine On
. Например, нет необходимости в 1 и 1, но это требуется на моем выделенном сервере.AFAIK, RewriteBase используется только для исправления случаев, когда mod_rewrite запускается в
.htaccess
файле, а не в корне сайта, и угадывает неправильный веб-путь (в отличие от пути файловой системы) для папки, в которой он запущен. Так что если у вас есть RewriteRule в .htaccess в папке, которая отображается наhttp://example.com/myfolder
вас, можно использовать:Если mod_rewrite не работает правильно.
Попытка использовать его для достижения чего-то необычного, а не для решения этой проблемы, звучит как рецепт, чтобы запутаться.
источник
RewriteBase полезен только в ситуациях, когда вы можете поместить только .htaccess в корень вашего сайта. В противном случае, возможно, вам лучше разместить свои файлы .htaccess в разных каталогах вашего сайта и полностью пропустить директиву RewriteBase.
В последнее время для сложных сайтов я убираю их, потому что это усложняет развертывание файлов из тестирования, чтобы жить еще на один шаг.
источник
Когда я разрабатываю, он находится в другом домене в папке. Когда я беру сайт вживую, эта папка больше не существует. Использование RewriteBase позволяет мне использовать один и тот же файл .htaccess в обеих средах.
Когда живешь:
При разработке:
источник
%{REQUEST_URI}
вRewriteCond
директиве, например?Самое ясное объяснение, которое я нашел, было не в текущих документах Apache 2.4, а в версии 2.0 .
Как это работает? Для вас, apache-хакеров, этот документ 2.0 содержит «подробную информацию о внутренних этапах обработки».
Извлеченный урок: хотя мы должны быть знакомы с «текущим», драгоценные камни можно найти в летописях.
источник
Эта команда может явно установить базовый URL для ваших переписываний. Если вы хотите начать с корня своего домена, перед RewriteRule добавьте следующую строку:
источник
Я считаю, что этот отрывок из документации Apache хорошо дополняет предыдущие ответы:
источник