1 votes

Apache <Directory /> paramètre affectant <Location /server-status>

Après avoir étudié la documentation, je ne m'attendrais pas à ce que les directives dans un conteneur affectent les URL non basées sur des systèmes de fichiers comme /server-status dans la configuration (complète) suivante :

DefaultRuntimeDir /var/run/apache2
PidFile /var/run/apache2/apache2.pid
User www-data
Group www-data
ErrorLog /var/log/apache2/error.log
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined
DocumentRoot /var/www/html

Listen 80

LoadModule mpm_worker_module /usr/lib/apache2/modules/mod_mpm_worker.so
LoadModule authz_core_module /usr/lib/apache2/modules/mod_authz_core.so
LoadModule     status_module /usr/lib/apache2/modules/mod_status.so

    SetHandler server-status

    Require all denied

Cependant, si j'exécute Apache/2.4.25 sur Debian stretch avec cette configuration comme

# apache2 -f demo.conf -X

J'obtiens

$ curl --head http://localhost/server-status
HTTP/1.1 403 Forbidden

alors que si je remplace denied dans la configuration ci-dessus par granted, j'obtiens

curl --head http://localhost/server-status
HTTP/1.1 200 OK

En d'autres termes, la directive Require dans le bloc affecte la disponibilité de cette URL. Quelle partie de la documentation explique cela?

0voto

snowdude Points 2790

Vous ne définissez qu'un seul contrôle d'accès :

    Require all denied

La section sur le fusion des directives explique que les sections Directory sont appliquées en premier, avant les directives des sections Location, peu importe leur ordre dans votre fichier httpd.conf.

Le comportement que vous observez est expliqué dans la directive AuthMerging :

Lorsque l'autorisation est activée, elle est normalement héritée par chaque section de configuration ultérieure, à moins qu'un ensemble différent de directives d'autorisation ne soit spécifié. C'est l'action par défaut...

Vous ne définissez aucun contrôle d'accès supplémentaire dans la section de configuration qui remplacerait le seul contrôle d'accès que vous avez défini, à savoir Require all denied et c'est ce contrôle d'accès qui est hérité par le module mod-status dans l'espace web /server-status.

0voto

user3442769 Points 1

Comme @ezra-s l'a souligné sur IRC, même pour les URI virtuels (comme /server-status dans la configuration exemple de la question), Apache tente de faire correspondre la partie initiale (/ dans ce cas) avec le système de fichiers. Pour les URI absolus, le / initial correspondra toujours au DocumentRoot, mais d'autres composants de chemin peuvent également correspondre, s'ils se trouvent sous le DocumentRoot. Nous pouvons remplacer les sections et de la configuration de la question par ce qui suit pour le démontrer :

    SetHandler server-status

    SetHandler server-status

    Require all denied

# Le répertoire /var/www/html/foo existe, ce qui rend /foo/server-status accessible :

    Require all granted

# Le répertoire /var/www/html/bar n'existe pas, ce qui rend /bar/server-status non accessible :

    Require all granted

# Mais cela aide quand même (par d'autres moyens) :

    Require all granted

C'est ainsi que les emplacements virtuels sont affectés par les blocs .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X