Как работает RewriteBase.htaccess
Я видел это в несколько .htaccess примеры
RewriteBase /
он, кажется, несколько похож по функциональности на <base href=""> HTML.
Я считаю, что он может автоматически добавлять свое значение к началу RewriteRule заявления (возможно без косой черты)?
Я не мог заставить его работать должным образом. Я думаю, что это использование может очень пригодиться для переносимости сайта, так как у меня часто есть сервер разработки, который отличается от производства один. Мой текущий метод оставляет меня удалять части из моего RewriteRule заявления.
может ли кто-нибудь кратко объяснить мне, как это реализовать?
спасибо
8 ответов:
по моим собственным словам, после прочтения документов и экспериментов:
можно использовать
RewriteBaseдля обеспечения базовый для вашего переписывает. Рассмотрим это# invoke rewrite engine RewriteEngine On RewriteBase /~new/ # add trailing slash if missing rewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ / [NC,R=301,L]это реальное правило, которое я использовал, чтобы гарантировать, что URL-адреса имеют конечную косую черту. Это преобразует
http://www.example.com/~new/pageдо
http://www.example.com/~new/page/при наличии
RewriteBaseтам, вы делаете относительный путь оторваться
RewriteBaseприменяется только к цель на относительные правила переписать.
используя RewriteBase, как это...
RewriteBase /folder/ RewriteRule a\.html b.htmlпо сути то же самое, что и...
RewriteRule a\.html /folder/b.htmlно когда .htaccess файл находится внутри
/folder/то это также указывает на ту же цель:RewriteRule a\.html b.htmlхотя документы подразумевают всегда использовать
RewriteBase, Apache обычно обнаруживает его правильно для путей под DocumentRoot, если:
вы используете
Aliasдирективывы используете .htaccess переписать правила для выполнения HTTP перенаправляет (вместо того, чтобы просто молча переписывать) в относительные URL-адреса
в этих случаях, вы можете обнаружить, что вам нужно указать RewriteBase.
однако, поскольку это запутанная директива, обычно лучше просто указать абсолютные (aka 'root relative') URI в ваших целях перезаписи. Другие разработчики, читающие ваши правила, поймут их более легко.
цитирую отличный подробный ответ Джона Лина здесь:
в файле htaccess mod_rewrite работает аналогично
<Directory>или<Location>контейнер. а тоRewriteBaseиспользуется для обеспечения относительного базового пути.например, скажем, у вас есть такая структура папок:
DocumentRoot |-- subdir1 `-- subdir2 `-- subsubdirвы можете:
http://example.com/(корень)http://example.com/subdir1(subdir1)http://example.com/subdir2(subdir2)http://example.com/subdir2/subsubdir(subsubdir)URI, который отправляется через
RewriteRuleотносительно каталога, содержащего файл htaccess. Так что если у вас есть:RewriteRule ^(.*)$ -
- в корневом htaccess и запрос
/a/b/c/d, затем захваченный URI () составляетa/b/c/d.- Если правило
subdir2и/subdir2/e/f/gтогда захваченный URIe/f/g.- Если правило находится в
subsubdir, запрос/subdir2/subsubdir/x/y/z, тогда захваченный URI-этоx/y/z.каталог, в котором находится правило, лишен этой части из Ури. База перезаписи не влияет на это, это просто то, как работает каждый каталог.
какая переписать базу тут do, предоставляет базу URL-пути (не a file-path base) для любых относительных путей в правила. Итак, скажем, у вас есть это правило:
RewriteRule ^foo$ bar.php [L]The
bar.php- это относительный путь, в отличии от:RewriteRule ^foo$ /bar.php [L]здесь
/bar.php- абсолютный путь. Абсолютный путь будет всегда быть "корень" (в структуре каталогов выше). Это означает, что независимо от того, находится ли правило в "корне", "subdir1", "subsubdir" и т. д. элемент/bar.phpпуть всегда соответствуетhttp://example.com/bar.php.но другое правило, с относительным путем, оно основано на каталоге, в котором находится правило. Так что если
RewriteRule ^foo$ bar.php [L]находится в "корне" и вы идете в
http://example.com/foo, вам вручилиhttp://example.com/bar.php. Но если это правило находится в каталоге "subdir1", и вы идете вhttp://example.com/subdir1/foo, вам вручилиhttp://example.com/subdir1/bar.php. так далее. Это иногда работает, а иногда нет, как говорится в документации, это должно быть требуются для относительных путей, но большую часть времени это, кажется, работает. За исключением случаев, когда вы перенаправляете (используяRфлаг, или неявно, потому что у вас естьhttp://hostв цели вашего правила). Это означает следующее правило:RewriteRule ^foo$ bar.php [L,R]если он находится в каталоге "subdir2", и вы идете в
http://example.com/subdir2/foo, mod_rewrite ошибется относительный путь как путь к файлу вместо URL-пути и из-заRфлаг, вы будете в конечном итоге перенаправлены на что-то вроде:http://example.com/var/www/localhost/htdocs/subdir1. Что, очевидно, не то, что вы хотите.вот тут
RewriteBaseприходит. Директива говорит mod_rewrite, что добавить в начало каждого относительного пути. так что если у меня есть:RewriteBase /blah/ RewriteRule ^foo$ bar.php [L]в "subsubdir", собирается
http://example.com/subdir2/subsubdir/fooбудет на самом деле служить мнеhttp://example.com/blah/bar.php. Адвокатура.php " добавляется в конец базы. В практика, этот пример обычно не то, что вы хотите, потому что вы не можете иметь несколько баз в одном контейнере каталога или файле htaccess.в большинстве случаев, он используется так:
RewriteBase /subdir1/ RewriteRule ^foo$ bar.php [L]где эти правила будут в каталоге "subdir1" и
RewriteBase /subdir2/subsubdir/ RewriteRule ^foo$ bar.php [L]будет в каталоге "subsubdir".
это частично позволяет сделать ваши правила портативными, так что вы можете удалить их в любой каталог и нужно только изменить базу вместо кучи правил. Например, если у вас:
RewriteEngine On RewriteRule ^foo$ /subdir1/bar.php [L] RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L] RewriteRule ^blah2$ /subdir1/blah2.php [L] ...такое что собираешься
http://example.com/subdir1/fooслужитьhttp://example.com/subdir1/bar.phpetc. И скажите, что вы решили переместить все эти файлы и правила в каталог "subsubdir". Вместо того, чтобы изменять каждый экземпляр/subdir1/до/subdir2/subsubdir/, вы могли бы просто иметь базу:RewriteEngine On RewriteBase /subdir1/ RewriteRule ^foo$ bar.php [L] RewriteRule ^blah1$ blah.php?id=1 [L] RewriteRule ^blah2$ blah2.php [L] ...а затем, когда вам нужно было переместить эти файлы и правила в другой каталог, просто измените базу:
RewriteBase /subdir2/subsubdir/и вот оно.
AFAIK, RewriteBase используется только для исправления случаев, когда mod_rewrite работает в
.htaccessфайл не в корне сайта, и он угадывает неправильный веб-путь (в отличие от пути файловой системы) для папки, в которой он работает. Так что если у вас есть переписчик в a .htaccess в папке, которая сопоставляется сhttp://example.com/myfolderвы можете использовать:RewriteBase myfolderЕсли mod_rewrite работает неправильно.
попытка использовать его для достижения чего-то необычного, а не для решения этой проблемы звучит как рецепт очень смущает.
RewriteBase полезен только в ситуациях, когда вы можете только поставить .htaccess в корне вашего сайта. В противном случае, вы можете быть лучше от размещения вашего другого .htaccess файлы в разных каталогах вашего сайта и полностью опуская директиву RewriteBase.
в последнее время, для сложных сайтов, я вынимаю их, потому что это делает развертывание файлов из тестирования, чтобы жить еще на один шаг сложнее.
когда я разрабатываю, он находится в другом домене в папке. Когда я беру сайт в прямом эфире, эта папка больше не существует. Используя RewriteBase позволяет мне использовать то же самое .файл htaccess в обеих средах.
когда в прямом эфире:
RewriteBase / # RewriteBase /dev_folder/при разработке:
# RewriteBase / RewriteBase /dev_folder/
самое ясное объяснение, которое я нашел, было не в текущих 2.4 Apache docs, а в версия 2.0.
# /abc/def/.htaccess -- per-dir config file for directory /abc/def # Remember: /abc/def is the physical path of /xyz, i.e., the server # has a 'Alias /xyz /abc/def' directive e.g. RewriteEngine On # let the server know that we were reached via /xyz and not # via the physical path prefix /abc/def RewriteBase /xyzКак это работает? Для вас Apache hackers, это 2.0 doc продолжает давать " подробную информацию о внутренних шагах обработки."
урок усвоен: хотя мы должны быть знакомы с "текущим", драгоценные камни можно найти в летописях.
эта команда может явно задать базовый URL для ваших перезаписей. Если вы хотите начать в корне вашего домена, вы должны включить следующую строку перед вашим RewriteRule:
RewriteBase /
Я считаю, что этот отрывок из документации Apache хорошо дополняет предыдущие ответы:
эта директива требуется при использовании относительного пути в a подстановка в контекст per-directory (htaccess), если ни один из выполняются следующие условия:
исходный запрос и подстановка находятся под DocumentRoot (в отличие от достижимых другими средствами, такими как псевдоним).
путь файловой системы к каталогу, содержащему RewriteRule, с суффиксом относительной подстановки также действителен как путь URL на сервер (это редкость).
Как уже упоминалось ранее, в других контекстах, это только полезно сделать правило, короче. Кроме того, как уже упоминалось ранее, вы можете достичь того же поместив файл htaccess в подкаталог.
Comments