Comment dois-je utiliser la directive <If> dans .htaccess?

16

J'essaie d'ajouter une instruction conditionnelle à l'aide de la directive If d'Apache dans mon fichier .htaccess.

J'ai référencé cette page http://httpd.apache.org/docs/trunk/mod/core.html#if mais elle n'élabore pas beaucoup / donne beaucoup d'exemples. Il donne deux exemples incomplets:

<Si% {REQUEST_METHOD} DANS GET, HEAD, OPTIONS> 

et

<Si "$ req {Host} = ''"> 

J'ai donc essayé d'ajouter ceci à mon fichier .htaccess:

<Si% {SERVER_PORT} DANS GET, HEAD, OPTIONS>
   # encore rien ici
</If>

Mais je reçois toujours l' erreur 500 lorsque j'essaie de charger la page. C'est sur mon installation locale, et cela fonctionnait bien auparavant (ou si je supprimais ce code). Je crois que je l'ai AllowOverride Allmis en place globalement, et le contexte de la directive If devrait la laisser être présente dans .htaccess ("Contexte: configuration du serveur, hôte virtuel, répertoire, .htaccess").

Quelqu'un peut-il me donner des exemples sur la façon d'utiliser correctement la directive <If>, ou des conseils sur les raisons pour lesquelles cela ne fonctionne pas pour moi?

Merci!

cwd
la source
1
Si vous obtenez une erreur 500, cela signifie qu'Apache a enregistré quelque chose dans votre journal des erreurs. Ça dit quoi? De plus, votre test pour SERVER_PORTin GET,HEAD,OPTIONSn'a aucun sens ( SERVER_PORTva être le numéro de port sur lequel la demande a été reçue).
larsks
Merci, larsks. Il semble que j'utilise apache 2.0 qui ne prend pas en charge la directive <If>. Peut-être que je dois examiner la mise à niveau vers 2.3. Au moins, cela explique pourquoi il n'y a aucun exemple nulle part (b / c la fonctionnalité est si nouvelle). Merci pour le conseil.
cwd

Réponses:

16

<If> n'est disponible que dans Apache 2.4+, alors assurez-vous d'abord que vous disposez de cette version.

Exemples

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_HOST} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

Alternatives à <If>

Il existe quelques autres solutions pour effectuer des instructions conditionnelles dans Apache 2.2 si vous êtes toujours bloqué avec cela.

  • Vous pouvez définir des variables d'environnement via:

    • Configuration d'Apache
    • SetEnvIf
    • de mod_rewrite RewriteMatch
  • Ensuite, vous pouvez effectuer des instructions conditionnelles en utilisant

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

Exemple:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX
Simon East
la source
1
Testez mais ne travaillez pas! dans le document d'apache, la <IfDefine>directive analyse uniquement au démarrage et le parameter-nameseul est possible en passant par l'invite de commande en utilisanthttpd -Dx=y
William Leung
Vos "Alternatives à If" fonctionnaient bien pour moi, bel exemple.
Kyborek