Spec-Zone.ru › CouchDB 3.5

/{db}/_design/{ddoc}/_rewrite/{path}

Предупреждение

Перезаписи объявлены устаревшими в CouchDB 3.0 и будут удалены в CouchDB 4.0.

ANY /{db}/_design/{ddoc}/_rewrite/{path}

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

Использование функции в виде строки для rewrites

Добавлено в версии 2.0: Если поле rewrites содержит функцию в виде строки, для предварительной обработки запросов и их маршрутизации используется сервер запросов.

Функция принимает объект Request2.

Возвращаемое функцией значение приводит к тому, что сервер перезаписывает запрос, направляя его по новому адресу, или немедленно возвращает ответ.

Чтобы перезаписать запрос, верните объект со следующими свойствами:

  • path (строка): перезаписанный путь.

  • query (массив): перезаписанный запрос. Если свойство не указано, используются исходные ключи запроса.

  • headers (объект): перезаписанные заголовки. Если свойство не указано, используются исходные заголовки запроса.

  • method (строка): HTTP-метод перезаписанного запроса ("GET", "POST" и т. д.). Если свойство не указано, используется исходный метод запроса.

  • body (строка): тело запросов "POST"/"PUT". Если свойство не указано, используется исходное тело запроса.

Чтобы немедленно ответить на запрос, верните объект со следующими свойствами:

  • code (число): возвращаемый код состояния HTTP (200, 404 и т. д.).

  • body (строка): тело ответа пользователю.

Пример A. Ограничение доступа.

function(req2) {
  var path = req2.path.slice(4),
    isWrite = /^(put|post|delete)$/i.test(req2.method),
    isFinance = req2.userCtx.roles.indexOf("finance") > -1;
  if (path[0] == "finance" && isWrite && !isFinance) {
    // Deny writes to  DB "finance" for users
    // having no "finance" role
    return {
      code: 403,
      body: JSON.stringify({
        error: "forbidden".
        reason: "You are not allowed to modify docs in this DB"
      })
    };
  }
  // Pass through all other requests
  return { path: "../../../" + path.join("/") };
}

Пример B. Разные ответы на запросы JSON и HTML.

function(req2) {
  var path = req2.path.slice(4),
    h = headers,
    wantsJson = (h.Accept || "").indexOf("application/json") > -1,
    reply = {};
  if (!wantsJson) {
    // Here we should prepare reply object
    // for plain HTML pages
  } else {
    // Pass through JSON requests
    reply.path = "../../../"+path.join("/");
  }
  return reply;
}

Использование массива правил для rewrites

Если поле rewrites содержит массив объектов правил, сервер перезаписывает запрос согласно первому подходящему правилу в массиве.

Каждое правило в массиве — это объект со следующими полями:

  • method (строка): HTTP-метод запроса, которому должен соответствовать метод запроса для применения правила. Если поле не указано, используется "*", который соответствует всем методам.

  • from (строка): шаблон для сравнения с URL и определения динамических переменных.

  • to (строка): путь, на который следует перезаписать URL. Он может содержать переменные, определённые при сопоставлении с шаблоном, а также аргументы запроса (аргументы URL и аргументы из элемента query).

  • query (объект): аргументы запроса, передаваемые в перезаписанный URL. Они могут содержать динамические переменные.

Пути to и from могут содержать строковые шаблоны с символами : или * в начале для определения динамических переменных при сопоставлении.

Для определения перезаписи используется первое правило в массиве rewrites, соответствующее входящему запросу. Чтобы правило соответствовало входящему запросу, его значение method должно совпадать с HTTP-методом запроса, а значение from — с путём запроса согласно следующей логике сопоставления шаблонов.

  • Сначала шаблон from и URL разделяются по / на список токенов. Например, если поле from имеет значение /somepath/:var/*, а URL — /somepath/a/b/c, то токены шаблона from — это somepath, :var и *, а токены URL — somepath, a, b и c.

  • Каждый токен шаблона, начинающийся с :, сопоставляется с соответствующим токеном URL и задаёт новую динамическую переменную: её имя — оставшаяся после : строка, а значение — токен из URL. В этом примере токен :var сопоставится с b и задаст var = a.

  • Токен-звёздочка * в шаблоне сопоставляется с любым количеством токенов URL и должен быть последним токеном в шаблоне. Он задаёт динамическую переменную, содержащую оставшиеся токены. В этом примере токен * сопоставится с токенами b и c и задаст * = b/c.

  • Чтобы шаблон считался соответствующим, остальные токены должны совпадать в точности. В этом примере somepath в шаблоне совпадает с somepath в URL, и все токены URL сопоставлены, поэтому это правило считается подходящим.

После обнаружения правила URL запроса перезаписывается с использованием полей to и query. Динамические переменные подставляются в переменные : и * в этих полях для формирования итогового URL.

Если подходящее правило не найдено, возвращается ответ 404 Not Found.

Примеры:

Правило

URL

Перезаписать на

Токены

{“from”: “/a”,

“to”: “/some”}

/a

/some

{“from”: “/a/*”,

“to”: “/some/*}

/a/b/c

/some/b/c

{“from”: “/a/b”,

“to”: “/some”}

/a/b?k=v

/some?k=v

k=v

{“from”: “/a/b”,

“to”: “/some/:var”}

/a/b

/some/b?var=b

var=b

{“from”: “/a/:foo/”,

“to”: “/some/:foo/”}

/a/b/c

/some/b/c?foo=b

foo=b

{“from”: “/a/:foo”,

“to”: “/some”, “query”: { “k”: “:foo” }}

/a/b

/some/?k=b&foo=b

foo=b

{“from”: “/a”,

“to”: “/some/:foo”}

/a?foo=b

/some/?b&foo=b

foo=b

Метод запроса, заголовки, параметры запроса, данные запроса и тело ответа зависят от конечной точки, на которую будет перенаправлен URL.

param db:

Имя базы данных

param ddoc:

Имя дизайн-документа

param path:

Путь URL для перезаписи

Copyright © 2025 The Apache Software Foundation — Licensed under the Apache License 2.0
https://docs.couchdb.org/en/3.5.1/api/ddoc/rewrites.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API