У меня есть хитрый вариант старой проблемы.
У меня есть сайт на основе apache, доступ к которому обычно должен осуществляться через http / порт 80. Однако для некоторых защищенных областей, требующих аутентификации (обозначенных как .htaccess), я хочу иметь возможность перенаправить пользователя на https / порт 443.
Ключевым моментом здесь является то, что я хочу, чтобы это всегда происходило для базовой аутентификации, т.е. я не хочу воссоздавать каждый файл htaccess с директивой перенаправления. Я хочу применить это только для базовой аутентификации (остальной трафик должен быть незашифрованным). Охраняемые территории разбросаны по всей территории. Можно ли как-то перенаправить все запросы базовой аутентификации на хост SSL?
Наконец-то я понял, как это делается на одном из наших серверов (предупреждение Ugly Hack).
Мы в основном запрещаем файлы .htaccess в разделе для хоста без SSL (порт 80). Это генерирует ошибку 500 при попадании в файл .htaccess.
Мы перенаправляем все 500 ошибок на хост SSL, где разрешены файлы .htaccess. «Настоящие» 500 сообщений об ошибках, вероятно, не будут работать и на стороне SSL, в то время как перенаправления, связанные с .htaccess, теперь работают на стороне SSL.
Ага - довольно некрасиво. Я не хочу повторять это, но решил, что передам это.
Я не думаю, что можно автоматически перенаправлять HTTP-запросы с базовой аутентификацией в определенное место - по крайней мере, не только с Apache httpd.
Но вы можете использовать SSLRequireSSL директива внутри Расположение block, чтобы заставить клиентов использовать HTTPS, иначе они получат ошибку 403.
В файле .htaccess в каталоге, доступ к которому осуществляется с помощью Basic Auth, поместите следующее:
SSLRequireSSL
ErrorDocument 403 /erreurs/403.php
ErrorDocument 401 /erreurs/401.php
Это перенаправит ваших посетителей, использующих http, на страницы с ошибками 401 или 403.
На этой странице поместите это:
<?php
$path = $SERVER['REQUEST_URI'];
if($_SERVER["HTTPS"] != "on")
{
header('HTTP/1.1 301 Moved Permanently');
header('Status: 301 Moved Permanently');
header('Cache-Control: max-age=31536000');
header('Content-Language: en');
header('Location: https://www.example.com/'.$path.'');
echo '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><title>301 Moved Permanently</title></head><body><h1>Moved Permanently</h1><p>The document has moved <a href="'.$path.'">here</a></p></body></html>';
}
else {
echo '<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><title>Forbidden</title></head><body><h1>Forbidden</h1><p>Forbidden</p></body></html>';
} ?>
Базовая аутентификация будет перенаправлена на HTTPS.