Я работаю над некоторой конфигурацией 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
?