Назад | Перейти на главную страницу

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

У меня есть сервер 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