web-dev-qa-db-fra.com

Comment devrais-je utiliser la directive <si> dans .htaccess?

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

J'ai référencé cette page http://httpd.apache.org/docs/trunk/mod/core.html#if Mais cela n'explique pas beaucoup/donner de nombreux exemples. Deux exemples incomplets que cela donne sont:

[.____] <si% {request_method} dans get, tête, options> [.____]

et

 <si "$ req {hôte} = ''"> [.____]

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

[.____] <if% {Server_port} dans get, tête, options> [.____] #nothing ici encore 
 </ If> [.____]

Mais je continue à obtenir erreur 500 lorsque j'essaie de charger la page. Ceci est sur mon installation locale et cela fonctionnait bien auparavant (ou si je supprime ce code). Je crois avoir AllowOverride All Configurez globalement, et le contexte de la directive si si la directive devrait être présent dans .htaccess ("contexte: configuration du serveur, hôte virtuel, répertoire, .htaccess").

Quelqu'un peut-il me donner quelques exemples de la manière d'utiliser correctement la directive <Si> ou de certaines directives sur la raison pour laquelle cela ne fonctionne pas pour moi?

Merci!

16
cwd

Les <If> La directive est uniquement disponible dans Apache 2.4+ et non 2.2 ou plus tôt.

http://httpd.apache.org/docs/2.4/mod/core.html#IF

Documentation non présente en 2.2:

http://httpd.apache.org/docs/2.2/mod/core.html#IF

16
tgriesser

<If> est uniquement disponible dans Apache 2.4+, alors assurez-vous d'abord que vous avez 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 y a quelques autres solutions pour faire des déclarations conditionnelles dans Apache 2.2 si vous êtes toujours bloqué avec cela.

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

    • Configuration Apache
    • SetEnvIf
    • mod_rewrite's RewriteMatch
  • Ensuite, vous pouvez effectuer des déclarations 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
16
Simon East