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

Apache .htaccess: SSLRequireSSL выдает внутреннюю ошибку сервера HTTP 500

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