2011-06-23 13 views
7

Wydaje się być to miejsce dla apache tak tu idzie :)Apache 2.2 przekierowanie do SSL * potem * do uwierzytelniania (roztworem <ale to bzdura?)

Wiek stary problem: jak więc przekierować na protokole HTTP> HTTPS, wtedy i tylko wtedy, gdy HTTPS, zrobić autoryzację?

oh - i chciałbym większość z nich w jednym fragmencie, który może być Include-ed w wielokrotności <katalogu> lub <lokalizacja> bloki, przepisuje więc oparte nie na poziomie hosta wirtualnego losowa ścieżka ...

Cóż, oto co mam, które nie wydają się działać:

W szczycie VirtualHost zablokować

# Set ssl_off environment variable 
RewriteEngine on 
RewriteCond %{HTTPS} =on 
RewriteRule^- [E=ssl] 

W lokalizacji lub katalogów bloku

RewriteEngine on 
# Case 1 redirect port 80 SSL 
RewriteCond %{HTTPS} !=on 
RewriteCond %{SERVER_PORT} =80 
RewriteRule^https://%{SERVER_NAME}%{REQUEST_URI} [R=301] 

AuthType Basic 
AuthBasicProvider external 
AuthExternal auth_pam 
AuthName "My Underpants" 
AuthzUnixgroup on 
Order Deny,Allow 
Deny from all 
Allow from env=!ssl 
Satisfy any 
Require group nice-users 

plusów

Wszystkie tego baru require mogą być wydobywane do pliku urywka umieścić w jednej linii na każdej lokalizacji

Ustaliła wymuszenie połączenia SSL i uwierzytelnienia dla każdej lokalizacji, więc mniejsze jest prawdopodobieństwo pomyłki.

Minusy

Krwawe piekło, prawie nie jest intuicyjne! Może być delikatny dla wszystkich, jakie znam ...

Czy jest lepszy sposób (nie, że znalazłem ...)?

Komentarze byłoby bardzo mile widziane, czy to ma jakieś poważne wady :)

Poza Życie byłoby o wiele łatwiejsze, jeśli Apache miał sensownego config składni z rodzajowego

< Jeśli wyrażenie >/If >

blok, który może być używany w dowolnym miejscu. Ma pewne specjalne bloki przypadków, takie jak IfModule, a następnie masz specjalne warianty przypadku, takie jak RewriteCond (co jest bardzo trudne do zdziwienia, jeśli nie jesteś do tego przyzwyczajony).

Cheers,

Tim

+0

Masz na myśli, że nie chcesz zarządzać na VH dla SSL i jeden dla nie-SSL? – regilero

+0

Istnieją przyzwoite rozwiązania tego problemu, jeśli możesz przejść do Apache 2.4, zobacz ... http://stackoverflow.com/a/26155051/762028 – Molomby

+0

Możliwy duplikat [apache .htaccess przekierowanie do HTTPS przed pytaniem o autoryzację użytkownika] (https://stackoverflow.com/questions/10267102/apache-htaccess-redirect-to-https-before-asking-for-user- authentication) – LWC

Odpowiedz

3

Jeśli chcąc zmusić całą witrynę do https, można użyć VirtualHost dyrektyw, a następnie jest dość prosta:

<VirtualHost *:80> 
    ServerName example.com 

    RedirectMatch (.*) https://example.com$1 

</VirtualHost> 

<VirtualHost *:443> 
    ServerName example.com 

    ... 
    ... 
    ... 
</VirtualHost> 
+0

Proste i skuteczne! – aland

-1

Przetestowałem Twoje rozwiązanie i nie zadziałało ...

Po długim czasie szukania rozwiązania, szukanie go za dużo i znajdowanie zawsze tych samych rzeczy, które nie działały, w końcu to zrobiłem: Używam SSLRequireSSL i ErrorDocument 403 skonfigurowanych ze statyczną stroną zawierającą kod JavaScript (dzięki this blog page).

w /etc/apache2/conf.d.opt/redirect_if_not_https.conf:

SSLRequireSSL 
ErrorDocument 403 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\ 
<html><head>\ 
<title>403 Forbidden</title>\ 
<script language=\"JavaScript\">\ 
window.location='https://'+window.location.hostname+window.location.pathname;\ 
</script>\ 
</head><body>\ 
<h1>Forbidden</h1>\ 
<p>You don't have permission to access that resource using simple HTTP. Please use HTTPS instead.</p>\ 
</body></html>" 

(zauważ, że stworzył /etc/apache2/conf.d.opt/)

I w aplikacji conf, to ten plik (na przykład w /etc/apache2/conf.d/trac.conf):

<LocationMatch "/trac"> 
    # All the classical configurations here 
    # ... 

    Include conf.d.opt/redirect_if_not_https.conf 
</LocationMatch> 
+0

To nie działa dla mnie. Strona wciąż próbuje wykonać podstawowe uwierzytelnianie na http. – sonofagun

+0

To działało dla mnie, na którym OS próbujesz to zrobić? –

+0

Scientific Linux. – sonofagun

2

Tim Watts "Rozwiązanie wydaje się działać najlepiej dla mnie, ale wymagało trochę ulepszenia. Również moja sytuacja jest trochę inna, ponieważ chcę zezwolić na określone adresy IP bez autoryzacji HTTP, ale to dodaje dodatkową linię.

Mod_rewrite domyślnie nie odziedziczy konfiguracji z VirtualHost.

Patrz: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteoptions

miałem zamiar wykorzystać „RewriteOptions odziedziczyć”, ale wydaje się, że dotyczy to zasad nadrzędnych po nich dzieci. W każdym razie myślałem o innym rozwiązaniu.

ciągu mojego SSL <VirtualHost> mam wiersz:

SetEnvIf Request_URI "/" using_ssl=yes 

Ustawia zmienną środowiskową using_ssl jeżeli żądanie URI zawiera ukośnik To trochę Hack jako I (czyli cały czas). „d wolą używać bezwarunkowe setEnv ale widocznie:

wewnętrzne zmienne środowiskowe określone w niniejszej dyrektywie są ustawione po dyrektyw najbardziej wczesne przetwarzania żądania są uruchamiane, takich jak kontrola dostępu oraz mapowanie URI-do-pliku. Jeśli ustawiana zmienna środowiskowa ma służyć jako wejście do wczesnej fazy przetwarzania, na przykład dyrektywa RewriteRule, należy zamiast tego ustawić zmienną środowiskową za pomocą SetEnvIf.

(źródło: http://httpd.apache.org/docs/2.2/mod/mod_env.html#setenv)

Mój config w moim zbiorniku wygląda następująco:

# Require a basic HTTP auth user 
AuthName "realm-name-goes-here" 
AuthType Basic 
AuthUserFile /var/www/etc/htpasswd 
Require valid-user 

# OR allow from non-SSL (which will be redirected due to mod_rewrite below!) 
Order Allow,Deny 
Allow from env=!using_ssl 

# OR allow from a trusted IP range 
# NB: This allows certain IPs without a username & password 
Allow from 192.168.0.0/16 

Satisfy Any 

# Force a redirect to HTTPS 
RewriteEngine On 
RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent] 

Prawdopodobnie chcesz spróbować tylko z 'R' zamiast 'R = stałe' pierwszy dla cele testowania.

Mam nadzieję, że jest to przydatne dla innych :)

Powiązane problemy