/{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