1

Я пытаюсь создать страницу прокси HTTP авторизации с помощью mod_auth_formApache2 mod_auth_form слишком много переадресаций под Адрес

Моя цель состоит в том, чтобы иметь одну страницу Auth в каталоге DocumentRoot, то, как только пользователь подключен, просто прокси все маршруты к «реальному» приложению, работающие на локальном хосте с другим портом.

Я создал свой виртуальный хост с директивами Auth под корень Location:

<VirtualHost *:80> 
    ServerName subdomain.example.com 

    DocumentRoot /var/www/subdomain.example.com/web/ 

    <Location /login.html> 
     Order allow,deny 
     Allow from all 
    </Location> 

    <Location /> 
     SetHandler form-login-handler 

     AuthType Form 
     AuthName realm 
     AuthFormProvider file 
     AuthUserFile /var/www/subdomain.example.com/.htpasswd 
     AuthFormLoginRequiredLocation "http://subdomain.example.com/login.html" 

     require valid-user 

     Session On 
     SessionCookieName session path=/ 
     SessionCryptoPassphrase any-secret-passphrase  
    </Location> 

    ProxyPass /login.html ! 
    ProxyPassReverse /login.html ! 
    ProxyPass/http://localhost:8888 
    ProxyPassReverse/http://localhost:8888 

    ErrorLog ${APACHE_LOG_DIR}/subdomain.example.com/error.log 
    CustomLog ${APACHE_LOG_DIR}/subdomain.example.com/access.log combined 
</VirtualHost> 

EDIT Все, что было нужно, чтобы изменить порядок <Location></Location> директив ... И добавить специальное место для форма обработчик. Рабочий раствор:

<VirtualHost *:80> 
    ServerName subdomain.example.com 

    DocumentRoot /var/www/subdomain.example.com/web/ 

    <Location /> 
     AuthType Form 
     AuthName realm 
     AuthFormProvider file 
     AuthUserFile /var/www/subdomain.example.com/.htpasswd 
     AuthFormLoginRequiredLocation "http://subdomain.example.com/login.html" 
     AuthFormLoginSuccessLocation "http://subdomain.example.com/" 

     require valid-user 

     Session On 
     SessionCookieName session path=/ 
     SessionCryptoPassphrase any-secret-passphrase  
    </Location> 

    <Location /login_check.html> 
     SetHandler form-login-handler 

     AuthType Form 
     AuthName realm 
     AuthFormProvider file 
     AuthUserFile /var/www/subdomain.example.com/.htpasswd 
     AuthFormLoginRequiredLocation "http://subdomain.example.com/login.html" 
     AuthFormLoginSuccessLocation "http://subdomain.example.com/" 

     require valid-user 

     Session On 
     SessionCookieName session path=/ 
     SessionCryptoPassphrase any-secret-passphrase  
    </Location> 

    <Location /login.html> 
     Order allow,deny 
     Allow from all 
    </Location> 

    ProxyPreserveHost On 
    ProxyPass /login.html ! 
    ProxyPassReverse /login.html ! 
    ProxyPass/http://localhost:8888 
    ProxyPassReverse/http://localhost:8888 

    ErrorLog ${APACHE_LOG_DIR}/subdomain.example.com/error.log 
    CustomLog ${APACHE_LOG_DIR}/subdomain.example.com/access.log combined 
</VirtualHost> 

Когда я пытаюсь получить доступ к subdomain.example.com, я перенаправлены на subdomain.example.com/login.html

Содержание этого (что это хорошо!) /var/www/subdomain.example.com/web/login.html страница:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset='utf-8' /> 
     <meta name='viewport' content='width=device-width' /> 
     <title>Authentication</title> 
    </head> 
    <body> 
     <form method='POST' action='/login_check.html'> 
      <div class='form-group'> 
       <label for='httpd_username'>Username</label> 
       <input id='http_username' class='form-control' type='text' name='httpd_username' value='' /> 
      </div> 
      <div class='form-group'> 
       <label for='httpd_password'>Password</label> 
       <input id='httpd_password' class='form-control' type='password' name='httpd_password' value='' /> 
      </div> 
      <div class='form-group'> 
       <input class='btn btn-success' type='submit' name='login' value='Login' /> 
      </div> 
     </form> 
    </body> 
</html> 

Однако, никогда не отображается эта страница login.html, я получаю сообщение об ошибке: TOO_MANY_REDIRECTS

The webpage at http://subdomain.example.com/login.html has resulted in too many redirects.

Кажется, что этот специальный маршрут должен быть «вниз заперт» в процессе Auth ... Но я понятия не имею, как включить, что ...

Я попытался добавить еще ErrorDocument 401 /login.html директиву, но это ничего не изменило.

+1

Вы можете попробовать отображение 'HTTP: // локальный: 8888' в подкаталог субдомена (например,' ProxyPass/прокси/http: // localhost: 8888/'), поэтому он не будет мешать вашему' login.html' - по крайней мере, как временное решение для тестирования. Если это работает, вы можете выяснить, почему «Location/login.html», похоже, не влияет. (Кроме того, ваши два параметра для «ProxyPass» должны либо иметь трейлинг-косую черту, либо оба они не имеют.) –

+0

Спасибо! Действительно, решение подпапки работает; За исключением того, что я заканчиваю с/proxy/в моем URL-адресе, который я бы предпочел избежать ... Есть ли способ избежать этого, сохраняя подпапку? В другой руке, как я могу выяснить, почему мой '' '' '' '' не работает? (Что вы имеете в виду с параметрами ProxyPass?) –

+1

Должен быть способ сделать ваш исходный макет каталога работать, но я не могу точно сказать, как без тестирования всего этого.Я бы предположил, что Apache оценивает блоки '' в том порядке, в котором они их найдут, поэтому второй блок будет переопределять первый. Вы пытались их заменить? Что касается параметров «ProxyPass»: у них есть «ProxyPass/monit/http: // localhost: 2812 /» или «ProxyPass/monit http: // localhost: 2812'. Я не совсем понимаю, почему, но я не мог получить доступ к некоторым страницам, если только один из параметров имел завершающую косую черту. –

ответ

1

Apache разбирает директивы конфигурации в том порядке, как их видит и применяет их в указанное место и все под ним, так что require valid-user от вашего <Location /> блока перекрывает Allow from all от вашего <Location /login.html> блока - вы в конечном итоге требует аутентификации для доступа ничего (в том числе login.html), поэтому вы начинаете с несанкционированного доступа при обращении к login.html и перенаправляетесь на login.html, чтобы войти в систему. Для вас существует цикл.

0

У меня была такая же проблема с Apache 2.4, но по другой причине. С Apache 2.4+, вместо использования:

<Location /login.html> 
    Order allow,deny 
    Allow from all 
</Location> 

Использование:

<Location /login.html> 
    Require all granted 
</Location>