Apache.redirection de htaccess vers HTTPS avant de demander l'authentification de l'utilisateur
Ceci est à moi .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 en utilisant http, ce qui signifie que le mot de passe sera envoyé en texte clair. Il va ensuite rediriger vers la version https et demander à nouveau le mot de passe.
Comment puis-je résoudre ce problème?
8 réponses
- je obtenir autour d'elle de cette façon. Il suffit d'autoriser Non-SSL car il sera redirigé puis require auth une fois 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
Si vous utilisez Apache 2.4, vous pouvez utiliser sections de configuration pour résoudre 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>
Merci beaucoup, Istador!
mon Apache est de la version 2.2 (Synology NAS DSM 5.1) donc ces deux-là ne fonctionnent pas:
RewriteOptions Inherit
IfVersion
après les avoir enlevées (et la section de la version >= 2.4). Le tout a commencé à travailler pour moi.
mais celui-ci seul 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, c'est vérifié travailler sur Apache 2.2, Synology DSM 5.1.
la solution contrôlée https://stackoverflow.com/a/15940387/2311074 fonctionne sur Firefox sur Ubuntu 16.04, mais il ne fonctionne pas sur Firefox sur Win 7.
Si vous voulez protéger votre dossier https://yourdomain.com/securefolder
ensuite, vous devez créer dans le dossier .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 sur la page d'erreur. L'astuce est d'utiliser le lien correct avec le https://
comme votre page d'erreur par défaut.
la webapp de notre client est installée dans son répertoire webuser. L'autorisation est traitée avant les règles mod_rewrite (https://serverfault.com/a/443185/253111), et nous ne pouvions pas obtenir la réponse acceptée pour fonctionner, donc mod_rewrite ne semblait pas une option.
finalement, nous avons explicitement requis SSL et utilisé la racine de l'application web sur HTTPS comme 403 et 404 documents d'erreur. Ainsi, lorsqu'on visite une page sur HTTP (qui n'est pas autorisée, d'où le 403) ou une page non existante (404), Il est redirigé vers ie. https://DOMAIN.TLD / ~WEBUSER / admin.
C'est l' .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:logout@DOMAIN.TLD/~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
la solution de Molomby fonctionne en 2.4 et plus, mais ne fonctionne pas avec la version actuelle de Debian 2.2.22.
Les solutions de Ben / Chris Heald ne fonctionnaient pas non plus pour moi en 2.2.22, mais cela était dû à une configuration d'ordre/satisfaction différente. Ces paramètres ont changé avec 2.4 et la solution semble incompatible avec 2.4 et au-dessus (la redirection fonctionne, mais le navigateur affiche juste une erreur non autorisée sans demander de justificatifs d'identité).
Voici un combinaison des deux solutions qui devraient fonctionner pour les versions en dessous et au-dessus de 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>
Exigences: mod_rewrite, mod_auth, mod_digest, mod_version
J'exécute Apache 2.2 et aucune des solutions ci-dessus n'a fonctionné 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 rediriger 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 seulement 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>
le regex dans FileMatch indique apache à SSLRequireSSL pour tous les fichiers sauf ssl.php-et transmettre l'utilisateur à ssl.php s'il essaie 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;
}
Ce qui se passe maintenant:
- Ouverture http://example.com/some/file.php vers l'avant pour https://example.com/some/file.php et demande le nom d'utilisateur & le mot de passe.
- Ouverture https://example.com/ se connecte via https et demande u/p
- Ouverture https://example.com/some/file.php fait essentiellement la même chose.
- ouverture http://example.com/ redirige vers une page de serveur apache par défaut
le dernier point est ce dont je ne suis pas heureux, si quelqu'un a une solution pour cela, je serais heureux d'en entendre parler. Choses que j'ai essayé de résoudre ce problème:
- Changé l'expression régulière (^$)|(^(?!SSL.php).*) explicitement également correspondre à des chaînes vides. N'a pas
- ajout D'une règle de réécriture pour réécrire une chaîne vide en index.php. Ne fonctionne pas non plus.
rien de ce qui précède n'a fonctionné pour moi, mais cela a fonctionné. Ma seule préoccupation est s'il y a certaines conditions par lesquelles l'autorité n'est pas déclenchée permettant à quelqu'un l'accès sans les justificatifs d'identité. Je ne suis pas sûr qu'il y en ait, mais peut-être que les gens brillants pourraient dire le contraire.
ce code redirige Non-www vers www et http vers https, with .htaccess du dossier auth.
Ceci est 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/ [L,R=301]
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/foldername/ [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>