Comment utiliser un chemin RELATIF avec AuthUserFile dans htaccess?

98

J'ai un .htaccess qui utilise l'authentification de base. Il semble que le chemin d'accès au fichier .htpasswd ne soit pas relatif au fichier htaccess, mais plutôt à la configuration du serveur.

Donc, même si j'ai les fichiers .htaccess et .htpasswd dans le même répertoire, cela ne fonctionne pas:

AuthType Basic
AuthName "Private Login"
AuthUserFile .htpasswd
Require valid-user

Cependant, cela fonctionne si je change le AuthUserFile pour utiliser le chemin absolu:

AuthType Basic
AuthName "Private Login"
AuthUserFile "/home/user/public_html/mydir/.htpasswd"
Require valid-user

Mais je préférerais quelque chose de plus mobile car je l'utilise sur plusieurs sites dans différents domaines. J'ai cherché sur le Web mais je n'ai pas trouvé de résolution. Est-il possible d'utiliser un chemin relatif ou des variables comme %{DOCUMENT_ROOT}?

DssTrainer
la source

Réponses:

51

Il n'est pas possible d'utiliser des chemins relatifs pour AuthUserFile :

File-path est le chemin vers le fichier utilisateur. S'il n'est pas absolu (c'est-à-dire s'il ne commence pas par une barre oblique), il est traité comme relatif au ServerRoot.

Vous devez accepter et contourner cette limitation.


Nous utilisons IfDefineavec un paramètre de ligne de commande apache2 :

.htaccess (convient aux systèmes de développement et en direct):

<IfDefine !development>
  AuthType Basic
  AuthName "Say the secret word"
  AuthUserFile /var/www/hostname/.htpasswd
  Require valid-user
</IfDefine>

Configuration du serveur de développement (Debian)

Ajoutez ce qui suit à /etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

Redémarrez ensuite votre apache et vous obtiendrez une invite de mot de passe uniquement lorsque vous n'êtes pas sur le serveur de développement.

Vous pouvez bien sûr ajouter un autre IfDefine pour le serveur de développement, copiez simplement le bloc et supprimez le fichier !.

cweiske
la source
4
Mais cela utilise toujours un chemin absolu ( /var/...) - et la question se pose: "comment utiliser un chemin relatif"?
sdaau
1
Et puis la question a été modifiée pour répondre correctement par un "non" :)
Erenor Paz
15

Car juste au cas où les gens recherchent une solution pour cela:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>
masque8
la source
1
Ce serait génial, mais est-il sûr de compter sur req('Host'), le client ne peut-il pas tromper cette valeur?
Marco Demaio
1
@MarcoDemaio Oui, cela peut / pourrait être trompé en utilisant, par exemple, l'adresse IP. Cela dépend de votre configuration. Ce n'est pas un oui ou un non absolu. Ça dépend.
Maxime
12

1) Notez qu'il n'est pas considéré comme sûr d'avoir le .htpasswdfichier sous la racine du serveur.

2) La documentation dit ceci à propos des chemins relatifs, il semble donc que vous n'avez pas de chance:

File-path est le chemin vers le fichier utilisateur. S'il n'est pas absolu (c'est-à-dire s'il ne commence pas par une barre oblique), il est traité comme relatif au ServerRoot .

3) Bien que les réponses recommandant l'utilisation de variables d'environnement fonctionnent parfaitement bien, je préférerais mettre un espace réservé dans le .htaccessfichier, ou avoir différentes versions dans ma base de code, et faire configurer le processus de déploiement (c'est-à-dire remplacer les espaces réservés ou renommer / déplacer le fichier approprié).

Sur les projets Java, j'utilise Maven pour faire ce type de travail, par exemple sur des projets PHP, j'aime avoir un script shell build.sh et / ou install.sh qui ajuste les fichiers déployés à leur environnement. Cela dissocie votre base de code des spécificités de son environnement cible (c'est-à-dire ses variables d'environnement et ses paramètres de configuration). En général, l'application doit s'adapter à l'environnement, si vous le faites dans l'autre sens, vous risquez de rencontrer des problèmes une fois que l'environnement doit également répondre à différentes applications ou à des exigences spécifiques au système totalement indépendantes.

Hanno Fietz
la source
8

vous pouvez mettre vos paramètres d'authentification dans un environnement. Comme:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development
<IfDefine !APPLICATION_ENV>
  Allow from all
  AuthType Basic
  AuthName "My Testseite - Login" 
  AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd
  Require user username
</IfDefine>

L'Auth fonctionne, mais je n'ai pas pu vraiment faire fonctionner mon environnement.

digitaldonkey
la source
1
Je pense que le problème est le suivant: "Seules les variables d'environnement définies par les directives SetEnvIf [NoCase] ​​antérieures sont disponibles pour être testées de cette manière. 'Précédemment' signifie qu'elles ont été définies à une portée plus large (comme à l'échelle du serveur) ou précédemment dans le champ d'application de la directive actuelle. " (trouvé ici: askapache.com/htaccess/setenvif.html ) Parce que vous avez la même portée, vous ne pouvez pas faire fonctionner votre environnement.
user470370
4
pourquoi cela ne fonctionne pas est exceptionnellement bon expliqué ici stackoverflow.com/questions/11073752/…
nico gawenda
Mais cela utilise toujours un chemin absolu ( /Users/...) - et la question se pose: "comment utiliser un chemin relatif"?
sdaau
Oui. Mais vous pouvez utiliser plusieurs paramètres APPLICATION_ENV afin d'utiliser plusieurs chemins absolus par environnement.
digitaldonkey
5

.htpasswd nécessite un chemin absolu complet depuis la racine absolue du serveur.

Veuillez obtenir le chemin absolu complet du fichier par écho echo $_SERVER['DOCUMENT_ROOT'];.

voici le script auth .htaccess de base de travail.

AuthType Basic
AuthName "Access to the Hidden Files"
AuthUserFile 'C:/xampp/htdocs/ht/.htpasswd'
Require valid-user

Avant la connexion

entrez la description de l'image ici

Connexion Afetr

entrez la description de l'image ici

Muni
la source
3

Si vous essayez d'utiliser XAMPP avec Windows et que vous souhaitez utiliser un fichier .htaccess sur un serveur en direct et également développer sur une machine de développement XAMPP, ce qui suit fonctionne très bien!


1) Après une nouvelle installation de XAMPP, assurez-vous qu'Apache est installé en tant que service.

  • Cela se fait en ouvrant le panneau de configuration XAMPP et en cliquant sur le petit "X" rouge à gauche du module Apache.
  • Il vous demandera ensuite si vous souhaitez installer Apache en tant que service.
  • Ensuite, il devrait devenir une coche verte.

2) Quand Apache est installé en tant que service, ajoutez une nouvelle variable d'environnement comme indicateur.

  • Arrêtez d'abord le service Apache à partir du panneau de configuration XAMPP.
  • Ensuite, ouvrez une invite de commande. (Vous connaissez la petite fenêtre noire qui simule DOS)
  • Tapez "C: \ Program Files (x86) \ xampp \ apache \ bin \ httpd.exe" -D "DEV" -k config .
  • Cela ajoutera un nouvel indicateur DEV aux variables d'environnement que vous pourrez utiliser plus tard.

3) Démarrez Apache

  • Ouvrez le panneau de configuration XAMPP et démarrez le service Apache.

4) Créez votre fichier .htaccess avec les informations suivantes ...

<IfDefine DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/sandbox/web/scripts/.htpasswd"
  require valid-user
</IfDefine>

<IfDefine !DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/home/arvo/public_html/scripts/.htpasswd"
  require valid-user
</IfDefine>

Pour expliquer le script ci-dessus, voici quelques notes ...

  • Mon AuthUserFile est basé sur ma configuration et mes préférences personnelles.
  • J'ai une boîte de développement de test locale qui a ma page Web située à c: \ sandbox \ web \ . Dans ce dossier, j'ai un dossier appelé scripts qui contient le fichier de mot de passe .htpasswd .
  • La première entrée IfDefine DEV est utilisée pour cette instance. Si DEV est défini (ce que nous avons fait ci-dessus, uniquement sur la machine de développement grossier), il utilisera cette entrée.
  • Et à son tour, si vous utilisez le serveur en direct, IfDefine! DEV sera utilisé.

5) Créez votre fichier de mot de passe (dans ce cas nommé .htpasswd) avec les informations suivantes ...

utilisateur: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Quelques points à noter ...

Arvo Bowen
la source
Mais cela utilise toujours un chemin absolu ( /home...) - et la question se pose: "comment utiliser un chemin relatif"?
sdaau
2

ou si vous développez sur localhost (uniquement pour apache 2.4+):

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>
amxm
la source
1

Je sais que c'est une vieille question, mais j'ai juste cherché la même chose et il y en a probablement beaucoup d'autres à la recherche d'une solution rapide et mobile. Voici ce que j'ai finalement trouvé:

# We set production environment by default
SetEnv PROD_ENV 1

<IfDefine DEV_ENV>
  # If 'DEV_ENV' has been defined, then unset the PROD_ENV
  UnsetEnv PROD_ENV

  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /var/www/foo.local/.htpasswd
  Require valid-user
</IfDefine>

<IfDefine PROD_ENV>
  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /home/foo/public_html/.htpasswd
  Require valid-user
</IfDefine>
ovi
la source
Mais cela utilise toujours un chemin absolu ( /var...) - et la question se pose: "comment utiliser un chemin relatif"?
sdaau
1
Oui, c'est une solution de contournement, car Apache ne prend pas en charge les chemins relatifs vers l'emplacement du .htaccessfichier. Si vous deviez utiliser un chemin relatif, il serait considéré comme relatif au ServerRoot.
ovi
1

Prenons un exemple.

Votre application se trouve dans / var / www / myApp sur un serveur Linux

.htaccess : /var/www/myApp/.htaccess

htpasswdApp : / var / www / myApp / htpasswdApp . (Vous êtes libre d'utiliser n'importe quel nom pour .htpasswd fichier )

Pour utiliser le chemin relatif dans .htaccess :

AuthType Digest
AuthName myApp
AuthUserFile "htpasswdApp"
Require valid-user

Mais il recherchera le fichier dans server_root répertoire . Pas dans document_root .

Dans tous les cas, lorsque l'application se trouve à / var / www / myApp :

racine_document est - / var / www / myApp

racine_serveur est / etc / apache2 // (juste dans notre exemple, car nous utilisons le serveur linux )

Vous pouvez le redéfinir dans votre fichier de configuration apache ( /etc/apache2/apache2.conf ), mais je suppose que c'est une mauvaise idée.

Donc, pour utiliser le chemin de fichier relatif dans votre /var/www/myApp/.htaccess, vous devez définir le fichier du mot de passe dans votre racine_serveur .

Je préfère le faire en suivant la commande:

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

Vous êtes libre de copier ma commande, d'utiliser un lien en dur au lieu d'un symbole ou de copier un fichier sur votre racine_serveur .

Sild
la source
1
comme apache bloque l'accès aux fichiers commençant par .ht * par défaut, il n'est pas recommandé d'utiliser des noms aléatoires pour eux.
cari