Подтвердить что ты не робот

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

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

RewriteBase /

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

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

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

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

Спасибо

4b9b3361

Ответ 1

По-моему, после прочтения документов и экспериментов:

Вы можете использовать RewriteBase, чтобы обеспечить базу для перезаписи. Рассмотрим это

# invoke rewrite engine
    RewriteEngine On
    RewriteBase /~new/

# add trailing slash if missing
    rewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]

Это реальное правило, которое я использовал, чтобы гарантировать, что URL-адреса имеют завершающую косую черту. Это преобразует

http://www.example.com/~new/page

to

http://www.example.com/~new/page/

Имея там RewriteBase, вы относите относительный путь к параметру RewriteBase.

Ответ 2

RewriteBase применяется только к target правила относительного переписывания.

  • Использование RewriteBase как это...

    RewriteBase /folder/
    RewriteRule a\.html b.html
    
  • по существу совпадает с...

    RewriteRule a\.html /folder/b.html
    
  • Но когда файл .htaccess находится внутри /folder/then, это также указывает на одну и ту же цель:

    RewriteRule a\.html b.html
    

Несмотря на то, что документы подразумевают использование RewriteBase, Apache обычно правильно определяет пути для Documentroot, если:

  • Вы используете директивы Alias

  • Вы используете правила перезаписи htaccess для выполнения перенаправления HTTP (а не просто молчания) для относительных URL

В этих случаях вы можете обнаружить, что вам нужно указать RewriteBase.

Однако, поскольку это запутанная директива, обычно лучше просто указывать абсолютные (ака "корневые относительные" ) URI в ваших переписывающих целях. Другие разработчики, читающие ваши правила, поймут их легче.



Цитата из Джон Лин отличный подробный ответ здесь:

В файле htaccess mod_rewrite работает аналогично контейнеру <Directory> или <Location>. и RewriteBase используется для предоставления относительной базы пути.

Например, скажем, что у вас есть эта структура папок:

DocumentRoot
   |-- subdir1
   |-- subdir2
       |-- subsubdir

Итак, вы можете получить доступ:

  • http://example.com/ (root)
  • 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 ($1) равен a/b/c/d.
  • Если правило находится в subdir2, а запрос /subdir2/e/f/g, то захваченный URI равен e/f/g.
  • Если правило находится в subsubdir, а запрос /subdir2/subsubdir/x/y/z, то захваченный URI равен x/y/z.

Каталог, в котором находится правило, содержит эту часть, удаленную от URI. База rewrite не влияет на это, это просто то, как работает каждый каталог.

Что делает база перезаписи, предоставляет базу URL-пути (а не базу файлов) для любых относительных путей в целевом элементе правила. Поэтому скажите, что у вас есть это правило:

RewriteRule ^foo$ bar.php [L]

bar.php - относительный путь, а не:

RewriteRule ^foo$ /bar.php [L]

где /bar.php - абсолютный путь. Абсолютным путем всегда будет "корень" (в структуре каталогов выше). Это означает, что независимо от того, находится ли правило в "root", "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. "Bar.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 и т.д. И скажите, что вы решили переместить все эти файлы и правила в каталог "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/

и что он.

Ответ 3

AFAIK, RewriteBase используется только для исправления случаев, когда mod_rewrite работает в файле .htaccess не в корне сайта, и он угадывает неправильный веб-путь (в отличие от пути к файловой системе) для папки, в которой он запущен Итак, если у вас есть RewriteRule в .htaccess в папке, которая отображается в http://example.com/myfolder, вы можете использовать:

RewriteBase myfolder

Если mod_rewrite работает некорректно.

Попытка использовать его для достижения чего-то необычного, а не для исправления этой проблемы, звучит как рецепт для очень запутывания.

Ответ 4

RewriteBase полезен только в ситуациях, когда вы можете поместить .htaccess в корневой каталог вашего сайта. В противном случае вам может быть лучше разместить ваши разные файлы .htaccess в разных каталогах вашего сайта и полностью исключить директиву RewriteBase.

В последнее время для сложных сайтов я их вынимаю, потому что он позволяет развертывать файлы из тестирования, чтобы жить еще один шаг.

Ответ 5

Когда я разрабатываю, он находится в другом домене внутри папки. Когда я беру сайт в прямом эфире, эта папка больше не существует. Использование RewriteBase позволяет использовать тот же файл .htaccess в обеих средах.

Когда живут:

RewriteBase /
# RewriteBase /dev_folder/

При разработке:

# RewriteBase /
RewriteBase /dev_folder/

Ответ 6

Самое ясное объяснение, которое я нашел, не было в текущих 2.4 apache-документах, но в версии 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, этот 2.0 doc продолжает давать "подробную информацию о внутренних этапах обработки".

Извлеченный урок: хотя нам нужно быть знакомым с "текущим", драгоценности можно найти в анналах.

Ответ 7

Эта команда может явно указать базовый URL для ваших перезаписи. Если вы хотите начать с корня своего домена, вы должны включить следующую строку перед RewriteRule:

RewriteBase /

Ответ 8

Я считаю, что этот отрывок из документации Apache, хорошо дополняет предыдущие ответы:

Эта директива требуется, если вы используете относительный путь в подстановки в контексте per-directory (htaccess), если ни один из выполняются следующие условия:

  • Исходный запрос и подстановка находятся под DocumentRoot (в отличие от достижимых другими способами, такими как псевдоним).

  • Путь файловой системы к каталогу, содержащему RewriteRule, дополненному относительной заменой, также действителен как путь URL-адреса на сервер (это редко).

Как упоминалось ранее, в других контекстах полезно ваше правило короче. Кроме того, как уже упоминалось выше, вы можете выполните одно и то же, поместив файл htaccess в подкаталог.