У меня есть сервер Apache 2.2 с сертификатом SSL, на котором размещено несколько служб, доступ к которым должен осуществляться только с использованием SSL.
то есть: https: //myserver.com/topsecret/ должно быть разрешено, а http: //myserver.com/topsecret/ следует либо отклонить, либо, в идеале, перенаправить на https. http://myserver.com/public не должно иметь этого ограничения и должно работать с использованием http или https.
Решение разрешить / запретить http принимается в каталоге верхнего уровня и влияет на все содержимое под ним.
Есть ли директива, которую можно поместить в конфигурацию Apache, чтобы ограничить доступ таким образом?
В SSLRequireSSL директива - это то, что вы ищете.
Внутри вашего <VirtualHost>
, или на верхнем уровне, если вы не используете виртуальные хосты:
<Directory /topsecret>
SSLRequireSSL
</Directory>
Или в .htaccess
:
SSLRequireSSL
В глобальной конфигурации вы можете использовать:
<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>
Последний также может быть помещен в директиву каталога в конфигурации глобального или виртуального хоста.
В качестве альтернативы вы можете использовать серверный язык для выполнения обработки за вас, а не использовать параметры конфигурации Apache (если, возможно, у вас нет доступа к конфигурации сервера).
Например, с PHP:
if (!isset($_SERVER['HTTPS'])) {
// put your redirect here
header('Location: http://myserver.com/public');
}
(хотя просто имейте в виду - если вы используете ISAPI в Microsoft IIS, если запрос не маршрутизируется через HTTPS, тогда значение переменной $ _SERVER ['HTTPS'] будет "выключено")
Кто-то упомянул SSLRequireSSL, но я не думаю, что он работает сам по себе, и я не нашел с ним успешного примера. Рекомендуемый способ https://wiki.apache.org/httpd/RedirectSSL Я применил это, и он хорошо работает!
Предполагая, что вы используете директивы VirtualHost,
Поместите директиву Directory в виртуальный хост без SSL, запрещающий доступ.
Затем поместите директиву Directory в виртуальный хост ssl, предоставляющий доступ.
Я всегда делал этот mod_rewrite в файле .htaccess, хотя вы также должны иметь возможность сделать это в своем основном файле конфигурации.
Вот руководство с несколькими способами сделать это: Умное перенаправление HTTP и HTTPS RewriteRule