Обмежте Apache, щоб дозволити доступ лише з використанням SSL для деяких каталогів


34

У мене є сервер Apache 2.2 з SSL-сертифікатом, на якому розміщено кілька служб, до яких повинен бути доступ лише за допомогою SSL.

тобто: https : //myserver.com/topsecret/ має бути дозволено, тоді як http : //myserver.com/topsecret/ має бути заборонено або, в ідеалі, перенаправлено на https. http://myserver.com/public не повинен мати це обмеження, і він повинен працювати за допомогою http або https.
Рішення дозволити / заборонити http приймається у каталозі верхнього рівня та впливає на весь вміст під ним.

Чи існує директива, яку можна помістити в конфігурацію Apache, щоб таким чином обмежити доступ?

Відповіді:


38

SSLRequireSSL директива це те , що ви шукаєте.

Всередині вашого <VirtualHost>або на верхньому рівні, якщо ви не використовуєте віртуальних хостів:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Або в .htaccess:

SSLRequireSSL

1
Ласкаво просимо до помилки сервера! Ми дійсно вважаємо за краще, щоб відповіді мали зміст, а не вказівки на зміст. Це теоретично може відповісти на питання, однак було б бажано сюди включити істотні частини відповіді та надати посилання для довідки. Дякую!
Chris S

8
Гаразд, я оновив свій приклад п'ятирічної давнини на прикладі :)
Томас

1
Якщо бути справедливим, 5 років чи ні, аргументація полягає в тому, що посилання, на яке ви вказуєте, може зникнути, що робить вашу відповідь більшою чи повністю марною тим, хто пізніше шукає інформацію. Тож я насправді проголосував за ваш примхливий коментар (чесний), але я також повністю згоден, що відповідь має мати певний контекст, щоб він залишався корисним. Тим більше, що це позначено як правильну відповідь.
Крейг

Я не думаю, що спільнота SO / SF була настільки суворою щодо простого зв'язку та відповідей "lmgtfy". Але я згоден; заднім числом редагування має сенс у будь-який час.
Томас

До якого файлу конфігурації я б додав цю інструкцію директиви?
дан Картер

8

У глобальній конфігурації ви можете використовувати:

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

Аналогічно, ви можете використовувати .htaccess файл у першому каталозі дерева безпечного каталогу:

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

Цей останній також може бути розміщений всередині директиви каталогів у глобальній або віртуальній конфігурації хоста.


Перенаправлення HTTP на HTTPS відкриває вам певні типи атак MiTM. Просто обережність.
Крейг

1

Крім того, ви можете використовувати мову на стороні сервера, щоб зробити обробку за вас, а не використовувати параметри конфігурації Apache (якщо, можливо, у вас немає доступу до конфігурації сервера).

Наприклад, з PHP:

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

(хоча просто врахуйте - якщо ви використовуєте ISAPI в Microsoft IIS, якщо запит не направляється через HTTPS, значення змінної $ _SERVER ['HTTPS'] буде "вимкнено")


1

Хтось згадав SSLRequireSSL, але я не думаю, що він працює сам по собі, і я не знайшов успішного прикладу з цим. Рекомендований спосіб https://wiki.apache.org/httpd/RedirectSSL Я застосував це, і він працює добре!


0

Припустимо, що ви використовуєте директиви VirtualHost,

Розмістіть директиву Директорії у non-ssl virtualhost, який забороняє доступ.

Потім розмістіть директиву Директорії у sssl virtualhost, що надає доступ.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.