Вопрос: Ограничить Apache только разрешить доступ с помощью SSL для некоторых каталогов


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

то есть: HTTPS: //myserver.com/topsecret/ должно быть разрешено пока HTTP: //myserver.com/topsecret/ должно быть либо отклонено, либо, в идеале, перенаправлено на https. http://myserver.com/public не должен иметь этого ограничения и должен работать с использованием либо http, либо https.
Решение о разрешении / запрете http выполняется в каталоге верхнего уровня и влияет на весь контент под ним.

Есть ли директива, которая может быть помещена в конфигурацию Apache, чтобы получить доступ таким образом?


29
2017-09-19 01:19


Источник




Ответы:


SSLRequireSSL директива - это то, что вы ищете.

Внутри <VirtualHost>, или на верхнем уровне, если вы не используете виртуальные хосты:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Или в .htaccess:

SSLRequireSSL

34
2017-09-19 01:24



Добро пожаловать в Server Fault! Мы действительно предпочитаем, чтобы ответы содержали контент, а не указатели на контент. Теоретически это может ответить на вопрос, было бы предпочтительнее чтобы включить здесь основные части ответа и предоставить ссылку для справки. Спасибо! - Chris S
Хорошо, я обновил свой пятилетний пост с помощью примера :) - Thomas
Справедливости ради, 5 лет или нет, аргументация состоит в том, что ссылка, на которую вы указываете, может исчезнуть, что делает ваш ответ в основном или совершенно бесполезным для кого-то, ища информацию позже. Поэтому я фактически проголосовал за ваш забавный комментарий (честный), но я также полностью согласен с тем, что ответ должен иметь некоторый контекст, чтобы он оставался полезным. Тем более, что это указано как правильный ответ. - Craig
Я не думаю, что сообщество SO / SF было таким же строгим в отношении только ссылок и ответов «lmgtfy». Но я согласен; ретроактивное редактирование имеет смысл в любое время. - Thomas
К какому файлу конфигурации я бы добавил эту директиву? - dan carter


В глобальной конфигурации вы можете использовать:

<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>

Это последнее можно также разместить внутри директивы каталога в глобальной или виртуальной конфигурации хоста.


7
2017-09-19 01:25



Перенаправление HTTP на HTTPS открывает вам определенные типы атак MiTM. Просто осторожность. - Craig


В качестве альтернативы, вы можете использовать серверный язык для обработки для вас, вместо использования параметров конфигурации Apache (если, возможно, у вас нет доступа к конфигурации сервера).

Например, с PHP:

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

(хотя просто имейте в виду - если вы используете ISAPI в Microsoft IIS, если запрос не маршрутизируется через HTTPS, тогда значение переменной $ _SERVER ['HTTPS'] будет отключено)


1
2017-09-19 01:27





Кто-то упомянул SSLRequireSSL, но я не думаю, что он работает сам по себе, и я не нашел успешного примера с ним. Рекомендуемый способ https://wiki.apache.org/httpd/RedirectSSL Я применил это, и он работает хорошо!


1
2017-12-21 13:54





Предполагая, что вы используете директивы VirtualHost,

Поместите директиву каталога в виртуальный хост, не поддерживающий ssl, запрещающий доступ.

Затем поместите директиву Directory в ssl virtualhost, предоставляющий доступ.


0
2017-09-19 01:22





Я всегда делал этот mod_rewrite в файле .htaccess, хотя вы также можете сделать это в своем основном файле конфигурации.

Вот руководство с несколькими способами сделать это: Переадресация Smart HTTP и HTTPS RewriteRule


0
2017-09-19 01:24