apache переписать перед аутентификацией местоположения - PullRequest
1 голос
/ 04 февраля 2012

Я пытаюсь настроить веб-сервер Apache для работы следующим образом:

if /specialdir/ -> no password check, no hostname check, no https redirect.
if 192.168.1.1 url -> redirect to https://hostname, do password check
if http://hostname/ -> redirect to https://hostname/, do password check
if '/' is requested -> redirect to https://hostname/entry/, do password check 

Итак, в итоге все URL-адреса, кроме specialdir, всегда должны посещаться через https://hostname с обязательной аутентификацией.

В настоящее время я использую следующую конфигурацию в httpd.conf, и все работает, за исключением того, что аутентификация выполняется дважды: один раз для подключения http и второй раз для подключения https. Каким-то образом моя конфигурация не выполняет перенаправление в первую очередь.

(да, я знаю, что использование Location считается неидеальным, однако, кажется, что этот способ проще применять к одной и той же конфигурации для всех URL / каталогов (поскольку у меня есть только одно исключение))

<Location />
    ## authentication
    AuthBasicProvider file ldap
    AuthUserFile /etc/apache2/.htpasswd
    AuthGroupFile /dev/null
    AuthType Basic
    # allow alternative authentication, here "file"    
    AuthzLDAPAuthoritative off
    AuthName "Login required"
    AuthLDAPURL "ldap://xxx?sAMAccountName" NONE
    AuthLDAPBindDN "xxx" 
    AuthLDAPBindPassword xxx
    require valid-user

    ## redirects
    Options +FollowSymLinks
    RewriteEngine On
    # in case /specialdir/ is requested - go there right away and
    # skip remaining checks.
    RewriteCond %{REQUEST_URI} "/specialdir/"
    RewriteRule (.*) $1 [L]
    # someone trying to access the host by IP - redirect to hostname.com
    RewriteCond %{HTTP_HOST} !^hostname.com [NC]
    RewriteRule (.*) https://hostname.com%{REQUEST_URI} [R=301,L]
    # https is off? redirect to https (because we are transmitting passwords)
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://hostname.com%{REQUEST_URI}
    # no directory requested - go to 'entry'.
    RedirectMatch ^/$ /entry/
</Location>


## allow unrestricted access to the following resources
<Directory /var/www/specialdir>
    # All access controls and authentication are disabled
    # in this directory
    Satisfy Any
    Allow from all 
</Directory>

1 Ответ

1 голос
/ 05 февраля 2012

Если у вас есть доступ к файлам конфигурации сервера, вы можете просто разделить части HTTP и HTTPS на 2 отдельных конфигурации vhost (или разделить их на 2 отдельных блока в вашем httpd.conf):

  • HTTP vhost либо обслуживает /specialdir/, либо перенаправляет на HTTPS
  • HTTPS vhost требует аутентификации.

Так что-то вроде этого в вашей конфигурации http vhost:

Options +FollowSymLinks

RedirectMatch ^/$ https://hostname.com/entry/

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/specialdir/
RewriteRule .* https://hostname.com%{REQUEST_URI} [R,L]

# maybe include your directory directive here as well
<Directory /var/www/specialdir>
    # All access controls and authentication are disabled
    # in this directory
    Satisfy Any
    Allow from all 
</Directory>

И у https vhost будут все ваши аутентификационные материалы.

...