Ограничьте 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 для ограничения доступа таким образом?

DrStalker
источник

Ответы:

38

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

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

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Или в .htaccess:

SSLRequireSSL
Томас
источник
1
Добро пожаловать в сбой сервера! Мы действительно предпочитаем, чтобы ответы содержали контент, а не указатели на контент. Это может теоретически ответить на вопрос, однако, было бы предпочтительно включить основные части ответа здесь, и предоставить ссылку для справки. Спасибо!
Крис С
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'] будет «выключено»)

Magsol
источник
1

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

Роберт
источник
0

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

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

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


источник
0

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

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

Джейсон Уодсворт
источник