У меня есть веб-сервер Apache, размещенный на one.com. Модуль OpenSSL активен и работает. Я могу манипулировать .htaccess и видеть реакцию. Я хочу полагаться на SSL, и перенаправление путем перезаписи работает нормально. Также мне нужна аутентификация пользователя. Он отлично работает с AuthType Basic
. Есть только один недостаток: когда пользователь запрашивает http://sub.example.com/non-existent-file (без SSL, конечно, с моим настоящим доменным именем), он увидит журнал - в командной строке без SSL. Конечно, я хочу запретить отправку паролей в незашифрованном виде. Я читал, что самым простым решением было бы использовать директиву SSLRequireSSL
, но моему Apache это, похоже, не нравится. Позвольте мне разобрать пример, чтобы воспроизвести ошибку. Полностью черный файл .htaccess позволяет серверу предоставлять контент как по http, так и по https. Если я добавлю только SSLRequireSSL
и ничего больше в .htaccess, я получу внутреннюю ошибку сервера HTTP 500.
.htaccess
SSLRequireSSL
→ 500 внутренняя ошибка сервера
Почему это и как я должен использовать вместо SSLRequireSSL
?
Мой полный файл .htaccess без SSLRequireSSL
:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=307]
Redirect 307 /index.php /pages/welcome.php
</IfModule>
<IfModule mod_authn_file.c>
AuthName "Get username and password from admin."
AuthType Basic
<if "%{REMOTE_ADDR} -ipmatch '192.168.0.0/24'">
AuthUserFile /home/user/www/sub.example.com/html/.htpasswd
</if>
<else>
AuthUserFile /customers/1/a/0/example.com/httpd.www/sub/.htpasswd
</else>
Require valid-user
Order deny,allow
Deny from all
Allow from 192.168.0.0/24 w3.org googlebot.com
Satisfy Any
</IfModule>
Мне не удалось определить мою версию Apache. Функция PHP apache_get_version ()
не существует. php_sapi_name ()
возвращает cgi-fcgi
. Я могу получить доступ к SSH-терминалу. Команды, начинающиеся с apache… или Apache…, отсутствуют. Но я полагаю, что Apache работает, потому что в phpinfo ()
он сообщает о константе $ _ SERVER ['SERVER_SOFTWARE']
, установленной на Apache
и $ _ENV ['SERVER_SOFTWARE']
также установлен на Apache
.
Вот как я справился с этим с помощью .htaccess:
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
<If "%{HTTPS} == 'on'">
AuthType Basic
AuthName "Restricted Files"
AuthBasicProvider file
AuthUserFile "/var/www/html/secrets/.passwd"
Require valid-user
</If>