Быстро перенести конфигурацию в 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)
    }
    // ...
  }
Другие вопросы по тегам