2013-07-17 3 views
2

Я очень потерял эту проблему, и я не знаю, где могла быть проблема, поэтому я надеюсь, что вы могли мне помочь.Лак и ESI HTTP AUTH

У меня есть аутентификация HTTP BASIC с symfony, и я пытаюсь найти URL-адрес, защищенный этим auth, с тегом на странице Drupal. Каждые запросы отправляются лаку

Я даю имя пользователя и пароль в URL, как, что:

<esi:include src="http://admin:[email protected]:8081/app.php/next"/> 

В моем файле конфигурации лака, у меня есть только то, что линии для auth.http:

if (req.http.Authorization) { 
    return (pass); 
} 

Мое бэкэнд для Symfony отлично работает без аутентификации через http, а аутентификация http работает хорошо, когда нет лака и тега esi.

Если кто-то есть представление о проблеме, пожалуйста, скажите мне, даже если это не так =)

ответ

4

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 всегда будут переданы в бэкэнд с заголовком авторизации клиента.

+0

Здравствуйте, Благодарю вас за ответ. Если я попытаюсь сделать это в теге , это потому, что пользователь и пароль будут _many_ пользователями и паролями для одного и того же URL-адреса. И поэтому я не могу установить его прямо в конфирмах Варниша. Итак, вы думаете, что это невозможно сделать? – Peekmo

+0

Это очень типичный вариант использования. Я обновил ответ. –

+0

Большое спасибо! Оно работает ! – Peekmo