Как работает RewriteBase.htaccess



Я видел это в несколько .htaccess примеры



RewriteBase /


он, кажется, несколько похож по функциональности на <base href=""> HTML.



Я считаю, что он может автоматически добавлять свое значение к началу RewriteRule заявления (возможно без косой черты)?



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



может ли кто-нибудь кратко объяснить мне, как это реализовать?



спасибо

1526   8  

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 тогда захваченный URI e/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.php etc. И скажите, что вы решили переместить все эти файлы и правила в каталог "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

    Ничего не найдено.