18 votes

Comment puis-je avoir un bloc .htaccess conditionnel ?

Il s'agit d'une question Apache que vous avez probablement déjà rencontrée. Je veux avoir un seul paquet source que je peux déployer sur ma station de travail, mon serveur de développement et mon serveur de production, mais pour qu'il charge différents paramètres .htaccess en fonction de l'URL.

Notez que j'utilisais une astuce avec un appel IfModule, mais cela ne fonctionnera pas avec notre nouveau serveur de production car il partage tous les mêmes modules que mon serveur de transit.

Notez que j'ai besoin de regrouper SetEnv avec ces réécritures. Actuellement, si vous utilisez RewriteCond, il n'est lié qu'à la RewriteRule suivante, mais pas au SetEnv en dessous.

15voto

Michael Cramer Points 2540

Au lieu d'utiliser SetEnv, utilisez les capacités de paramétrage des variables d'environnement de RewriteRule lui-même :

RewriteCond %{HTTP_HOST} =foo.com
RewriteRule ^ - [E=VARNAME:foo]

RewriteCond %{HTTP_HOST} =bar.com
RewriteRule ^ - [E=VARNAME:bar]

Bien que je préfère faire ce genre de choses en passant des drapeaux au processus httpd au démarrage et en les recherchant à l'aide de blocs IfDefine.

<IfDefine FOO>
SetEnv VARNAME foo
</IfDefine>

<IfDefine BAR>
SetEnv VARNAME bar
</IfDefine>

6voto

Volomike Points 7083

Sur Ubuntu Linux le IfDefine La variable de l'utilisateur est définie dans

/etc/apache2/envvars

et s'appelle APACHE_ARGUMENTS . Donc, au bas de ce fichier, j'ai dû ajouter :

export APACHE_ARGUMENTS="-D dev"

...et ensuite faire rebondir le serveur avec :

/etc/init.d/apache2 stop
/etc/init.d/apache2 start

Sur d'autres systèmes :

Cependant, il y a un article de Debian sur ce sujet qui discute de cela ici . Dans cet exemple, le fichier à modifier est /etc/default/apache2 et la variable s'appelle APACHE_DEFINES .

De même, sur certains systèmes, il s'agit d'une variable nommée OPTIONS qui est fixé dans /etc/sysconfig/httpd .

Donc, ce que vous devez vraiment faire est de chercher la section start dans votre fichier apache2ctl. Donc, commencez par faire un whereis apache2ctl pour trouver où se trouve ce script, l'extraire et trouver la section de début avec la directive apache2 dedans, et voir si la variable qu'il passe est OPTIONS , APACHE_ARGUMENTS , APACHE_DEFINES ou autre chose. Ensuite, voyez quel fichier vous devez modifier en expérimentant avec l'une des deux méthodes suivantes /etc/sysconfig/httpd , /etc/default/apache2 ou /etc/apache2/envvars .

2voto

chichilatte Points 103

J'ai essayé le IfDefine et cela n'a pas fonctionné, même si la variable définie que j'avais passée au démarrage d'Apache apparaissait bien dans la méthode phpinfo() sur le APACHE_ARGUMENTS ligne.

J'ai essayé une autre méthode et cela a parfaitement fonctionné. Dans votre .htaccess vous avez besoin de quelque chose comme :

# Is the domain local (i wanted to check two names)? <If "%{SERVER_NAME} != 'localhost' && %{SERVER_NAME} != 'myproject.localhost'"> # I wanted to password protect the production server only AuthType Basic AuthName "Restricted area" AuthUserFile /app/.htpasswd require valid-user </If>

J'utilise Apache 2.4. Il se peut que cela ne fonctionne pas pour les versions antérieures.

1voto

Voici un exemple simple qui devrait vous suffire pour le modifier en fonction de vos besoins :

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteBase /

    RewriteCond %{HTTP_HOST} !^localhost
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X