Подтвердить что ты не робот

Apache.htaccess перенаправляет HTTPS, прежде чем запрашивать аутентификацию пользователя

Это мой .htaccess:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

AuthUserFile /etc/hi
AuthName "hi"
AuthType Basic
require valid-user

Он запрашивает аутентификацию пользователя с помощью http, что означает, что пароль будет отправлен в виде обычного текста. Он будет перенаправлен на версию https и снова запросит пароль.

Как я могу это исправить?

4b9b3361

Ответ 1

Я обойду это так. Просто разрешите Non-SSL, так как он будет перенаправлен, тогда требуется авторизация один раз на SSL...

SetEnvIf %{SERVER_PORT} ^80$ IS_NON_SSL

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

AuthUserFile /etc/hi
AuthName "hi"
AuthType Basic
require valid-user
Allow from env=IS_NON_SSL

Ответ 2

Если вы используете Apache 2.4, вы можете использовать разделы конфигурации, чтобы решить эту проблему довольно легко.

Например...

# Redirect to HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# Authenticate users only when using HTTPS
# Enable for <v2.4
 # SSLRequireSSL
 # ErrorDocument 403 /secure-folder/
# Enable for >v2.4
<If "%{HTTPS} == 'on'">
    AuthType Basic
    AuthName "Special things"
    AuthUserFile /etc/blah.htpasswd
    # Prevent this 'Require' directive from overriding any merged previously
   <IfVersion >= 2.4>
      AuthMerging And
   </IfVersion>
    Require valid-user
# Enable for >v2.4
</If>

Ответ 3

Спасибо, Истадор!

Мой Apache имеет версию 2.2 (Synology NAS DSM 5.1), поэтому эти два не работают на нем:

RewriteOptions Inherit
IfVersion

После этого они (и раздел версии >= 2.4) выйдут. Все это начало работать для меня.

Есть много предложений для этой темы, я потратил два дня, чтобы попробовать их.

Но только для меня это работает.

Вот что я сделал:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

AuthType Basic
AuthName "private area"
AuthUserFile /path/to/file/.htdigest

Order Deny,Allow
Deny from all
Satisfy Any
Allow from env=!HTTPS
Require valid-user

Итак, он проверен для работы с Apache 2.2, Synology DSM 5.1.

Ответ 4

Проверенное решение fooobar.com/questions/259156/... работает в Firefox на Ubuntu 16.04, но оно не работает в Firefox на Win 7.

Если вы хотите защитить свою папку https://yourdomain.com/securefolder то вам нужно создать в этой папке .htaccess со следующим содержимым:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

SSLRequireSSL
ErrorDocument 403 https://yourdomain.com/securefolder
AuthType Basic
AuthName "Admin"
AuthUserFile /outside/your/www/folder/.htpasswd
Require user admin Admin

Как это работает, когда вы вызываете сайт через http:// вместо https://, он перенаправляет вас на страницу с ошибкой. Фокус в том, чтобы использовать правильную ссылку с https:// в качестве страницы ошибок по умолчанию.

Ответ 5

Наш клиентский webapp установлен в его каталоге webuser. Авторизация обрабатывается до правил mod_rewrite (https://serverfault.com/a/443185/253111), и мы не смогли получить принятый ответ на работу, поэтому mod_rewrite не был вариантом.

В конце концов мы явно потребовали SSL и использовали корень webapp поверх HTTPS как 403 и 404 документов ошибок. Поэтому, когда вы посещаете какую-либо страницу через HTTP (которая является несанкционированной, следовательно, 403) или несуществующая страница (404), он перенаправляется на ie. https://DOMAIN.TLD/~WEBUSER/admin.

Это файл .htaccess с дополнительной информацией в комментариях.

### INFO: Rewrites and redirects are handled after authorisation
### @link https://serverfault.com/a/443185/253111

### INFO: Log out of a HTPASSWD session
### This was not always possible, but Firefox and Chrome seem to end sessions
### when a new one is trying to be using ie.:
### https://logout:[email protected]/~WEBUSER/
### @link http://stackoverflow.com/a/1163884/328272

### FORCE SSL: Explicitly require the SSL certificate of a certain domain to
### disallow unsigned certificates, etc. ErrorDocument commands are used to
### redirect the user to an HTTPS URL.
### @link http://forum.powweb.com/showthread.php?t=61566
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire  %{HTTP_HOST} eq "DOMAIN.TLD"

### HTPASSWD AUTHENTICATION
AuthUserFile /var/www/vhosts/DOMAIN.TLD/web_users/WEBUSER/.htpasswd
AuthType Basic
AuthName "Hello"
Require valid-user

### ERROR DOCUMENTS: Redirect user in case of a 403 / 404.
ErrorDocument 403 https://DOMAIN.TLD/~WEBUSER/admin
ErrorDocument 404 https://DOMAIN.TLD/~WEBUSER/admin

Ответ 6

Решение Molomby работает в версии 2.4 и выше, но не работает с текущей версией Debian 2.2.22.

Решения Ben/Chris Heald также не работали для меня в 2.2.22, но это было связано с другим порядком/удовлетворяющим конфигурации. Эти настройки изменились с 2.4, и решение кажется несовместимым с 2.4 и выше (перенаправление работает, но браузер просто показывает несанкционированную ошибку без запроса учетных данных).

Вот комбинация обоих решений, которые должны работать для версий ниже и выше 2.4:

RewriteEngine on
RewriteOptions Inherit # rewrite rules from parent directories
RewriteCond %{HTTPS} off
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

AuthType Digest
AuthName "private area"
AuthDigestProvider file
AuthUserFile /path/to/file/.htdigest

<IfVersion < 2.4>
    Order Deny,Allow
    Deny from all
    Satisfy Any # reset this to 'All' in custom <Files> and <Directory> directives that block access
    Allow from env=!HTTPS
    Require valid-user
</IfVersion>
<IfVersion >= 2.4>
    <If "%{HTTPS} == 'on'">
        AuthMerging And
        Require valid-user
    </If>
</IfVersion>

Требования: mod_rewrite, mod_auth, mod_digest, mod_version

Ответ 7

Я запускаю Apache 2.2, и ни один из вышеперечисленных решений не работал у меня. Я нашел обходное решение для меня здесь. В принципе, вам необходимо установить SSLRequireSSL и использовать некоторый язык script в ErrorDocument для перенаправления пользователей на HTTPS. К сожалению, в моем случае это работает только при доступе к определенным файлам на сервере, это НЕ работает, если только домен предоставлен. Вот что я сделал:

AuthType Basic
AuthName "Password Protected Area"
AuthUserFile /my/path/to/.htpasswd
#Require valid-user

<FilesMatch "(^(?!ssl.php).*)">
        SSLRequireSSL
        ErrorDocument 403 /ssl.php
        Require valid-user
</FilesMatch>

Регулярное выражение в FileMatch сообщает apache SSLRequireSSL для всех файлов, кроме ssl.php, и перенаправляет пользователя на ssl.php, если он пытается получить доступ без SSL.

Мой ssl.php выглядит так:

if(!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "" || $_SERVER['HTTPS'] == "off")
{
        $redirect = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: $redirect");
        exit;
}

Что теперь происходит:

Последнее, что мне не нравится, если у кого-то есть решение для этого, я был бы рад услышать об этом. Что я пытался решить эту проблему:

  • Изменено регулярное выражение на (^ $) | (^ (?! ssl.php). *), чтобы явно также соответствовать пустым строкам. Не работает
  • Добавлено правило перезаписи, чтобы переписать пустую строку в index.php. Не работает.

Ответ 8

Ничто из вышеперечисленного не сработало для меня, но это сработало. Единственное, что меня беспокоит, так это наличие определенных условий, при которых аутентификация не запускается, позволяя кому-либо получить доступ без учетных данных. Я не уверен, что есть, но, возможно, вы, яркие люди, можете сказать иначе.

Этот код перенаправляет не-www на www и http на https с аутентификацией папки .htaccess.

Это содержимое файла htaccess в каталоге, который вы хотите защитить:

RewriteEngine on
# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/foldername/$1 [L,R=301]
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/foldername/$1 [L,R=301]

# Apache 2.4 If
<If "%{HTTPS} == 'on' && %{HTTP_HOST} =~ /www/">
AuthType Basic
AuthName "Protected folder"
AuthUserFile "/home/etc/.htpasswds/public_html/foldername/passwd"
require valid-user
</If>

Ответ 9

Вот единственное решение, которое работало в одной из моих конфигураций:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

<If "%{SERVER_PORT} != '80'">
    AuthUserFile /etc/hi
    AuthName "hi"
    AuthType Basic
    require valid-user
</If>

Примечательно, что это для Apache 2.4, который я не могу контролировать (виртуальный хостинг). Кажется, что переменная %{HTTPS} не определена в этой конфигурации, и любое решение, основанное на SSLRequireSSL генерировало 500 внутренних ошибок сервера.


(Примечание: если вы предпочитаете 403 Запрещено вместо 301 Перманентного перенаправления при обслуживании HTTP-запросов, используйте вместо этого RewriteRule ^(.*)$ - [F,L])