Variables httpd.conf: Quelle est la différence entre $ {var} et% {var}?


7

Quelle est la différence entre ${var}et %{var}dans httpd.conf?

Comment et quand utiliserait-on ${}et %{}?

http://httpd.apache.org/docs/2.4/configuring.html mentionne:

Les valeurs des variables définies avec les variables d'environnement Define of ou shell peuvent être utilisées dans les lignes du fichier de configuration à l'aide de la syntaxe $ {VAR}.

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html mentionne:

Variables serveur: Ce sont des variables de la forme% {NAME_OF_VARIABLE}

et

Expansions RewriteMap: Ce sont des extensions de la forme $ {mapname: key | default}.

Sera ${VAR}utilisé partout dans httpd.conf, sauf dans la directive mod_rewrite (comme RewriteCond, RewriteRule mais à l'exception des extensions RewriteMap qui utilisent ${}comme dans RewriteRule ^ / ex /(.*) $ {examplemap: $ 1} )

Une variable définie dans httpd.conf à l'aide de SetEnvIfDirective, pour une utilisation dans le même httpd.conf, serait-elle utilisée comme ${var}sauf lorsque la variable est utilisée avec les directives mod_rewrite, où la variable serait utilisée comme %{var}?

Réponses:


5

Quelle est la différence entre $ {var} et% {var} dans httpd.conf?

À peu près tout. Il n'y a pas de règle stricte qui dit " $fait x, %fait y", car ils font des choses différentes selon l'endroit et la façon dont ils sont utilisés.

$ {VAR} sera-t-il utilisé partout dans httpd.conf, sauf dans la directive mod_rewrite

Non - ${VAR}est appliqué en remplacement à chaque emplacement de la configuration, même dans une ligne liée à mod_rewrite. Ceux-ci ne peuvent être définis qu'au démarrage à l'aide de l' -Doption passée au binaire httpd ou de la Definedirective.

Cela peut être fait car ces variables ne doivent pas contenir de :caractère, tandis que l' RewriteMaputilisation doit contenir un :caractère. Cela permet d' $utiliser le de manière extrêmement différente sans conflit - l'analyseur voit le :et sait qu'il n'est pas censé le remplacer.

Une variable définie dans httpd.conf à l'aide de la directive SetEnvIf, pour une utilisation dans le même httpd.conf, serait-elle utilisée comme $ {var} sauf lorsque la variable est utilisée avec les directives mod_rewrite, où la variable serait utilisée comme% {var}?

Non. Les variables d'environnement ne sont pas les mêmes que les variables définies via -Dou Define- elles sont un contexte par demande complètement séparé (ce sont celles avec SetEnvIflesquelles vous définissez ), que seules certaines directives utiliseront. Ils sont spécifiquement mentionnés là où ils sont pris en charge - dans mod_rewrite, ils le sont %{ENV:variable}, dans les journaux, ils sont %{variable}e, et beaucoup de directives ont une vérification logique qui ressemble env=variable.


Donc en gros; c'est un désordre déroutant - un témoignage de l'histoire du serveur Web au cours des deux dernières décennies. La principale chose qui vous prête à confusion est probablement que la syntaxe de mod_rewrite ne s'étend à aucune autre partie de la configuration; c'est tout différent. Le principal point à retenir de tout cela est qu'il n'y a pas de «règle» gouvernante pour donner un sens à tout cela - un $dans un endroit signifie quelque chose de complètement différent d'un $dans un autre endroit.

Quelques points de référence pratiques:

  1. Si vous cherchez à définir une variable statiquement au démarrage d'Apache, utilisez Defineet ${VAR}à remplacer une fois, au démarrage d'Apache. Ceci est surtout utile lorsque vous voulez faire quelque chose comme partager des fichiers de configuration entre un environnement de développement et de production - mais cela ne doit pas être confondu avec l'utilisation de $from RewriteMap, qui contient toujours un :.
  2. Si vous cherchez à travailler avec des variables dans des demandes spécifiques, les variables d'environnement sont ce que vous recherchez - mais vous ne pouvez pas faire d'hypothèses sur la syntaxe que vous utiliserez pour les atteindre lorsqu'elles sont utilisées avec une directive spécifique. Vous devrez vérifier la documentation de cette directive.
  3. Lorsque mod_rewrite est en question, jetez tout ce que vous pensiez savoir sur les variables et leur syntaxe. Il possède son propre ensemble de variables %{VAR}, vous pouvez accéder à vos variables d'environnement «normales» avec %{ENV:VAR}et vous pouvez définir des variables d'environnement avec [E=VAR].

Hou la la! merci pour cette longue écriture! Il me faudra un certain temps pour digérer cela. Assez étrange que les documents Apache ne documentent pas cela en un seul endroit, cela doit être assez déroutant pour beaucoup de débutants.
X10

Ouais - leurs documents ne sont pas mauvais pour des concepts spécifiques, mais les trucs «d'ensemble» comme celui-ci sont beaucoup moins clairs.
Shane Madden

1

J'ai regardé le code source de mod_rewrite et trouvé que les notes dans les commentaires (fonction do_expand):

        /* variable lookup */
        else if (*p == '%') {
        ...
        /* map lookup */
        else {     /* *p == '$' */

il semble donc, comme% sont pour les variables exactes, tandis que $ sont pour les recherches dans les tables de hachage ("maps"). en outre, toutes les extensions mod_rewrite sont complètement indépendantes de l'expansion core - whole effectuée par le module lui-même.

J'ai pensé plus tôt, mais c'était faux:

$ {} vars sont des utilisations d'environnement de projet, et évalués au moment de l'analyse de configuration.

% {} vars est l'environnement d'utilisation de la demande et évalué au moment de l'analyse de la demande. mod_rewrite utilise% {} symantic pour empêcher l'interpolation de temps de configuration effectuée par le noyau httpd.


Merci, pourriez-vous s'il vous plaît inclure le lien vers la documentation d'origine pour cela et si possible, un lien vers un tutoriel?
X10

Je n'ai jamais vu cela en texte clair dans la documentation. C'est ainsi que j'ai compris pourquoi cela a été fait. Et c'était faux :)
datacompboy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.