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 и снова запросит пароль.
Как я могу это исправить?
Ответы
Ответ 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]
)