Быстро перенести конфигурацию в CloudFlare Workers
Как можно переписать следующий код для работы с функцией CF Workers?
# Start
if(req.url ~ "^/app" ) {
set req.url = regsub(req.url, "^/app/", "/");
set req.http.X-DR-SUBDIR = "app";
}
#end condition
1 ответ
Cloudflare Workers реализует стандарт Service Worker, поэтому вам нужно будет переопределить фрагмент кода VCL, который вы разместили в терминах Service Worker.
Прежде чем я покажу вам, как это сделать, подумайте, что происходит, когда запрос https://example.com/apple
прибывает на прокси. Я ожидаю, что первое регулярное выражение для ^/app
чтобы соответствовать, но второй для ^/app/
не совпадать - т.е. запрос будет передан без изменения URL, но с добавлением X-DR-SUBDIR: app
заголовок.
Я подозреваю, что поведение является ошибкой, поэтому я сначала реализую работника, как если бы первое регулярное выражение было ^/app/
,
addEventListener("fetch", event => {
let request = event.request
// Unlike VCL's req.url, request.url is an absolute URL string,
// so we need to parse it to find the start of the path. We'll
// need it as a separate object in order to mutate it, as well.
let url = new URL(request.url)
if (url.pathname.startsWith("/app/")) {
// Rewrite the URL and set the X-DR-SUBDIR header.
url.pathname = url.pathname.slice("/app".length)
// Copying the request with `new Request()` serves two purposes:
// 1. It is the only way to actually change the request's URL.
// 2. It makes `request.headers` mutable. (The headers property
// on the original `event.request` is always immutable, meaning
// our call to `request.headers.set()` below would throw.)
request = new Request(url, request)
request.headers.set("X-DR-SUBDIR", "app")
}
event.respondWith(fetch(request))
})
Вернуться к https://example.com/apple
В случае, если нам действительно нужен Cloudflare Worker, который педантично воспроизводит поведение фрагмента VCL, мы могли бы изменить эти строки (комментарии исключены):
if (url.pathname.startsWith("/app/")) {
url.pathname = url.pathname.slice("/app".length)
// ...
}
к этим:
if (url.pathname.startsWith("/app")) {
if (url.pathname.startsWith("/app/")) {
url.pathname = url.pathname.slice("/app".length)
}
// ...
}