У меня есть веб-сервер Apache, размещенный на one.com. Модуль OpenSSL активен и работает. Я могу манипулировать .htaccess и видеть реакцию. Я хочу полагаться на SSL, и перенаправление путем перезаписи работает нормально. Также мне нужна аутентификация пользователя. Он отлично работает с AuthType Basic
. Есть только один недостаток: когда пользователь запрашивает http://sub.example.com/non-existent-file (без SSL, конечно, с моим настоящим доменным именем), они увидят запрос на вход без SSL. Конечно, я хочу запретить отправку паролей в незашифрованном виде. Я читал, самым простым решением было бы использовать SSLRequireSSL
директиву, но моему Apache она, похоже, не нравится. Позвольте мне разобрать пример, чтобы воспроизвести ошибку. А полностью черный .htaccess file позволяет серверу предоставлять контент как по 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>