Пример конфигурации для Varnish, если вы решили отдавать им CORS headers, чтобы разрешить кросс-доменные запросы.
Запросы бывают простые и сложные с точки зрения спецификации CORS, где:
- простые запросы — это GET, POST, HEAD с заголовками из набора Accept, Accept-Language, Content-Language, Content-Type, последний со значениями application/x-www-form-urlencoded, multipart/form-data или text/plain.
- сложные запросы — все остальные
Для простых — достаточно передать заголовок: Access-Control-Allow-Origin с указанием разрешенных доменных имен или «*» для любых доменов. Т.е. в секции vcl_deliver достаточно добавить:
1 2 3 4 |
sub vcl_deliver { set resp.http.Access-Control-Allow-Origin = "*"; ... } |
Для сложных запросов следует задать дополнительные заголовки.
Access-Control-Allow-Methods — перечислить разрешенные типы запросов;
Access-Control-Allow-Headers — перечислить разрешенные заголовки запроса, дополнительно к тем, что позволены в простом случае.
Для сложных запросов браузер выполняет сначала предварительную отправку методом «OPTIONS». И если сервер подтверждает, что принимает такой запрос (сервер должен вернуть код 200 и заголовки описанные выше), то выполняется уже сам запрос (к примеру, «GET»).
Чтобы браузер не выполнял двойного запроса в следующий раз для конкретного адреса, сервер может устанавливать заголовок Access-Control-Max-Age, указывая время в секундах, в течении которого действует разрешение.
Пример заголовков:
1 2 3 4 5 6 |
sub vcl_deliver { set resp.http.Access-Control-Allow-Origin = "*"; set resp.http.Access-Control-Allow-Methods= "GET, OPTIONS, PUT"; set resp.http.Access-Control-Allow-Headers = "Origin, Accept, Content-type, Expires"; set resp.http.Access-Control-Max-Age = "3600"; } |
Если запрос содержит какой то из заголовков, которых нет в списке, тогда вы увидите в консоли браузера сообщение вроде:
Access to XMLHttpRequest at ‘http://mysite.com/’ from origin ‘http://test.loc’ has been blocked by CORS policy: Request header field expires is not allowed by Access-Control-Allow-Headers in preflight response.