Проверка измененного запроса лака позже в конвейере - PullRequest
0 голосов
/ 10 мая 2019

Я работаю над некоторой конфигурацией Varnish, которая размещена в Fastly, так что это их настроенный Varnish 2.1.

Моя главная цель - сделать запросы на

https://www.example.com/the-project
  • обрабатывается внутренним именем F_The_Project (которое настраивается через быстрый интерфейс)
  • отправляется на сервер без /the-project компонента начального пути
  • перенаправляется на https (если они былиПервоначально http)
  • имеет специальную Политику безопасности контента.

Основанием для этого является то, что www.example.com является основным сайтом нашей команды, а Project - это то, что было доставлено третьей стороной и размещено отдельно.

На данный момент у меня есть некоторый VCL, который выглядит следующим образом:

declare local var.the-project-backend  STRING;
set var.the-project-backend = "the-project.website.example.com";

sub vcl_recv {
    if (req.url ~ "^/the-project") {
        set.req.backend = F_The_Project;
        set.req.url = regsub(req.url, "/the-project", "");
        # set req.http.host = var.the-project-backend;
    }

    if (req.http.Fastly-SSL
        && req.url !~ "^/foo$"
        && req.url !~ "^/bar$"
        && req.url !~ "^/$")
    {
        error 900;
    }

    return (lookup);
}

sub vcl_deliver {
    set resp.http.Content-Security-Policy = "script-src https://*.cdn.com";

    if (req.request == "GET" && req.backend == F_The_Project) {
        set resp.http.Content-Security-Policy = resp.http.Content-Security-Policy "; frame-src https://*.thirdparty.com";
    }

    return (deliver);
}

sub vcl_error {
    if (obj.status == 900) {
        set obj.status = 302;
        set obj.response = "Moved Temporarily";
        set obj.http.Location = "http://" req.http.host req.url;
        synthetic {""};

        return (deliver);
    }
}

(Это извлеченная частьVCL. Реальный - намного больше и полон устаревших вещей. Одна из самых странных унаследованных функций, с которыми я имею дело, - это сумасшедшая нестандартная ошибка, которая используется для возврата к http. Но для целей моей работыРентная задача, кажется, работает.Я считаю, что это потому, что одно из условий возврата к http - это то, что путь должен , а не быть похожим на ^/$.Поскольку мы убираем часть пути /the-project, путь запроса фактически равен /.)

Теперь, когда я делаю:

$ curl -v https://www.example.com/the-project

, я получаю ответ 200из бэкэнда.Но я не получаю Политику безопасности контента.Если я удаляю условие req.backend == F_The_Project в vcl_deliver, я получаю frame-src https://*.thirdparty.com CSP на всех запросах, что тоже неправильно.

Такое ощущение, что req.backend недоступно с vcl_deliver.Но я не могу найти какую-либо документацию, подтверждающую это.

Так как я могу изменить свой CSP в зависимости от серверной части запроса?

И подвопрос: обратите внимание на комментариииз set req.http.host = var.the-project-backend.Согласно другим, правильная установка req.http.host приводит к тому, что запрос переходит к этому бэкэнду без перенаправления на стороне клиента.Тем не менее, я обнаружил, что если я установлю req.http.host, то получу 302 ответа.Каково ожидаемое поведение настройки req.http.host?

...