Ogranicz Apache, aby zezwalać na dostęp tylko za pomocą SSL dla niektórych katalogów


34

Mam serwer Apache 2.2 z certyfikatem SSL, na którym znajduje się kilka usług, do których dostęp powinien odbywać się wyłącznie przy użyciu SSL.

tzn .: https : //myserver.com/topsecret/ powinno być dozwolone, podczas gdy http : //myserver.com/topsecret/ powinno być albo odrzucone, albo, najlepiej, przekierowane do https. http://myserver.com/public nie powinien mieć tego ograniczenia i powinien działać przy użyciu protokołu HTTP lub https.
Decyzja o zezwoleniu / odmowie http jest podejmowana w katalogu najwyższego poziomu i wpływa na całą zawartość pod nim.

Czy istnieje konfiguracja, którą można umieścić w konfiguracji Apache w celu ponownego uzyskania dostępu w ten sposób?

Odpowiedzi:


38

SSLRequireSSL dyrektywy jest to, czego szukasz.

Wewnątrz <VirtualHost>lub na najwyższym poziomie, jeśli nie korzystasz z hostów wirtualnych:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Lub w .htaccess:

SSLRequireSSL

1
Witaj w Server Fault! Naprawdę wolimy, aby odpowiedzi zawierały treść, a nie wskaźniki do treści. Może to teoretycznie odpowiedzieć na pytanie, jednak lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik. Dziękuję Ci!
Chris S

8
Ok, zaktualizowałem swój pięcioletni post o przykład :)
Thomas

1
Szczerze mówiąc, 5 lat lub nie, powodem jest to, że link, na który wskazujesz, może zniknąć, co czyni twoją odpowiedź w większości lub całkowicie bezużyteczną dla kogoś, kto przyjdzie poszukać informacji później. Więc właściwie głosowałem za waszym ponurym komentarzem (szczerze), ale całkowicie zgadzam się, że odpowiedź powinna mieć pewien kontekst, aby była użyteczna. Zwłaszcza, że ​​jest oznaczony jako poprawna odpowiedź.
Craig

Nie sądzę, żeby społeczność SO / SF była tak rygorystyczna wobec samego linku i odpowiedzi „lmgtfy”. Ale zgadzam się; zmiana retroaktywna ma sens w dowolnym momencie.
Thomas

Do jakiego pliku konfiguracyjnego dodałbym tę instrukcję dyrektywy?
Dan Carter

8

W konfiguracji globalnej możesz użyć:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Podobnie możesz użyć pliku .htaccess w pierwszym katalogu bezpiecznego drzewa katalogów:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Ten ostatni można również umieścić w dyrektywie katalogowej w konfiguracji hosta globalnego lub wirtualnego.


Przekierowanie HTTP na HTTPS otwiera cię na niektóre rodzaje ataków MiTM. Tylko uwaga.
Craig

1

Alternatywnie możesz użyć języka po stronie serwera, aby wykonać przetwarzanie za Ciebie, zamiast korzystać z opcji konfiguracji Apache (jeśli być może nie masz dostępu do konfiguracji serwera).

Na przykład z PHP:

if (!isset($_SERVER['HTTPS'])) {
  // put your redirect here
  header('Location: http://myserver.com/public');
}

(choć należy pamiętać - jeśli używasz ISAPI w Microsoft IIS, jeśli żądanie nie jest kierowane przez HTTPS, wówczas wartość zmiennej $ _SERVER ['HTTPS'] będzie „wyłączona”)



0

Zakładając, że korzystasz z dyrektyw VirtualHost,

Umieść dyrektywę Directory w wirtualnym hoście innym niż ssl, odmawiając dostępu.

Następnie umieść dyrektywę katalogową w wirtualnym hoście ssl udzielającym dostępu.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.