ESI в лаке не работает как IFrame или ссылку тега в браузере в том, что он не подключитесь к любому URL-адресу, который вы ему даете. ESI только начинает новый запрос в лак и проходит через рабочий процесс (vcl_recv и т. Д.).
Вы ожидаете, что лак будет действовать как клиент-клиент, проанализировав URL-адрес, установив заголовок авторизации, установив заголовок узла на api.dev:8081 и инициировав новое http-соединение/запрос, которого он не будет. В этом случае я предполагаю, что он запускает новый req с req.url, установленным в /app.php/next, наследуя заголовки запроса запроса для родительского ресурса (содержащего тег esi) или, возможно, полностью игнорирует тег esi.
Путь сделать то, что вы хотите сделать, это (в vcl_recv):
if (req.esi_level > 0 && req.url == "/app.php/next") {
set req.http.Authorization = "BASIC [base64 encoded admin:adminpass]"
return (pass);
}
, а затем еси тег должен выглядеть <esi:include src="/app.php/next" />
Если вам нужен запрос ESI ударить другого бэкенд сервер, вам нужно добавить этот сервер в качестве другого имени бэкэндом:
backend authorization_needed {
.host = "api.dev";
.port = "8081";
}
и в vcl_recv, скажите лак, чтобы использовать его для запросов ЭРИ:
if (req.esi_level > 0 && req.url == "/app.php/next") {
set req.http.Authorization = "BASIC [base64 encoded admin:adminpass]"
set req.backend = authorization_needed;
return (pass);
}
вам может понадобиться установить req.http.Host в том, что если блок, если бэкенд отвечает на другой виртуальный хост, чем «api.dev».
Update:
Поскольку основное разрешение исходит от клиента, и вы вызываете возврата (пропуск), когда req.http.Authorization присутствует, лак не будет ESI процесс на этих страницах. Вы должны явно включить esi в vcl_fetch(), который не вызывается при передаче.
Так пройти авторизацию для фрагментов ESI, но не для родительской страницы, изменения в vcl_rev:
if (req.http.Authorization && req.esi_level == 0) {
set req.http.X-Esi-Authorization = req.http.Authorization;
unset req.http.Authorization;
}
else if (req.http.X-Esi-Authorization && req.esi_level > 0) {
set req.http.Authorization = req.http.X-Esi-Authorization;
return (pass);
}
И добавить к vcl_fetch:
if (req.http.X-Esi-Authorization) {
set beresp.do_esi = true;
}
Чистый эффект является родительским ответ кэшируемый и обработает esi, сами фрагменты esi всегда будут переданы в бэкэнд с заголовком авторизации клиента.
Здравствуйте, Благодарю вас за ответ. Если я попытаюсь сделать это в теге, это потому, что пользователь и пароль будут _many_ пользователями и паролями для одного и того же URL-адреса. И поэтому я не могу установить его прямо в конфирмах Варниша. Итак, вы думаете, что это невозможно сделать? –
Peekmo
Это очень типичный вариант использования. Я обновил ответ. –
Большое спасибо! Оно работает ! – Peekmo