web-dev-qa-db-fra.com

Apache .htaccess redirige vers HTTPS avant de demander l'authentification de l'utilisateur

Ceci est mon .htaccess:

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

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

Il demande l'authentification de l'utilisateur via http, ce qui signifie que le mot de passe sera envoyé en texte brut. Il faudra ensuite rediriger vers la version https et redemander le mot de passe.

Comment puis-je résoudre ce problème?

27
cedivad

Je le contourne de cette façon. Il suffit d'autoriser Non-SSL car il sera redirigé puis nécessiter une fois l'authentification sur 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
13
Ben

Si vous utilisez Apache 2.4, vous pouvez utiliser les sections de configuration pour résoudre ce problème assez facilement.

Par exemple...

# 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>
15
Molomby

Merci beaucoup, Istador!

Mon Apache est de la version 2.2 (Synology NAS DSM 5.1), donc ces deux ne fonctionnent pas:

RewriteOptions Inherit
IfVersion

Après les avoir pris (et la section de version> = 2.4). Tout a commencé à fonctionner pour moi.

Il y a beaucoup de suggestions sur ce sujet, j'ai passé deux jours à les essayer.

Mais seul celui-ci fonctionne pour moi.

Voici ce que j'ai fait:

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

Donc, il est vérifié de fonctionner sur Apache 2.2, Synology DSM 5.1.

9
MXW

La solution vérifiée https://stackoverflow.com/a/15940387/2311074 fonctionne sur Firefox sous Ubuntu 16.04, mais ne fonctionne pas sur Firefox sous Win 7.

Si vous souhaitez protéger votre dossier https://votredomaine.com/securefolder .__, vous devez créer dans ce dossier un .htaccess avec le contenu suivant:

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

La façon dont cela fonctionne est que lorsque vous appelez le site Web par le biais de http:// au lieu de https://, il vous redirigera vers la page d'erreur. L'astuce consiste à utiliser le lien correct avec le https:// comme page d'erreur par défaut. 

4
Adam

L'application Web de notre client est installée dans son répertoire d'utilisateurs Web. L'autorisation est gérée avant les règles mod_rewrite ( https://serverfault.com/a/443185/253111 ) et nous n'avons pas pu obtenir la réponse acceptée au travail. Mod_rewrite ne semblait donc pas une option.

Finalement, nous avons explicitement requis SSL et utilisé la racine de l'application Web sur HTTPS en tant que documents d'erreur 403 et 404. Ainsi, lorsque l’on visite une page via HTTP (non autorisée, d’où la 403) ou une page non existante (404), il est redirigé vers ie. https: //DOMAIN.TLD/~WEBUSER/admin .

Ceci est le fichier .htaccess avec quelques informations supplémentaires dans les commentaires.

### 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
2
lmeurs

La solution de Molomby fonctionne dans les versions 2.4 et supérieures, mais ne fonctionne pas avec la version actuelle de Debian 2.2.22.

Les solutions Ben's/Chris Heald ne fonctionnaient pas non plus pour moi dans la version 2.2.22, mais cela était dû à une configuration différente ordre/satisfaction. Ces paramètres ont changé avec la version 2.4 et la solution semble être incompatible avec la version 2.4 et les versions ultérieures (la redirection fonctionne, mais le navigateur affiche simplement une erreur non autorisée sans demander d'informations d'identification).

Voici une combinaison des deux solutions qui devraient fonctionner pour les versions inférieures et supérieures à 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>

Conditions requises: mod_rewrite, mod_auth, mod_digest, mod_version

1
Istador

J'utilise Apache 2.2 et aucune des solutions ci-dessus ne fonctionne pour moi. J'ai trouvé une solution de contournement pour moi ici . Fondamentalement, vous devez définir SSLRequireSSL et utiliser un langage de script dans ErrorDocument pour transférer les utilisateurs vers HTTPS. Malheureusement, dans mon cas, cela ne fonctionne que lorsque vous accédez à des fichiers particuliers sur le serveur, cela ne fonctionne PAS si seul le domaine est fourni. Voici ce que j'ai fait:

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>

La regex dans FileMatch dit à Apache de faire SSLRequireSSL pour tous les fichiers sauf ssl.php - et de le renvoyer vers ssl.php s’il tente d’accéder sans SSL.

Mon ssl.php ressemble à ceci:

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;
}

Qu'est-ce qui se passe maintenant:

Le dernier point est ce qui ne me satisfait pas, si quelqu'un a une solution pour cela, je serais heureux d'en entendre parler. Les choses que j'ai essayé de résoudre ce problème:

  • Modification de l'expression régulière en (^ $) | (^ (?! Ssl.php). *) Afin qu'elle corresponde explicitement aussi aux chaînes vides. N'a pas marché
  • Ajout d'une règle de réécriture pour réécrire une chaîne vide dans index.php. Ne fonctionne pas non plus.
1
user3205494

Aucun de ce qui précède n'a fonctionné pour moi, mais cela a fonctionné. Ma seule préoccupation concerne les éventuelles conditions dans lesquelles l'autorisation n'est pas déclenchée, permettant l'accès à une personne sans les informations d'identification. Je ne suis pas sûr qu'il y en ait, mais peut-être que vous, les gens brillants, direz le contraire.

Ce code redirige les non-www vers www et http vers https, avec l'authentification du dossier .htaccess.

Voici le contenu du fichier htaccess dans le répertoire que vous souhaitez protéger:

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>
0
MarkApp

Voici la seule solution qui a fonctionné dans l'une de mes configurations:

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>

Notamment, il s’agit d’un Apache 2.4 sur lequel je n’ai aucun contrôle (hébergement partagé). Il semble que la variable %{HTTPS} ne soit pas définie sur cette configuration et toute solution basée sur SSLRequireSSL a généré une erreur de 500 serveur interne.


(Remarque: si vous préférez une redirection 403 interdite au lieu d'une redirection permanente 301 lors du traitement de requêtes HTTP, utilisez plutôt RewriteRule ^(.*)$ - [F,L])

0
Boris