40 votes

règle mod_rewrite pour rediriger toutes les requêtes sauf pour un chemin spécifique

J'essaie de rediriger toutes les requêtes vers mon domaine vers un autre domaine en utilisant mod_rewrite dans une déclaration de VirtualHost Apache 2.2. Il y a une exception à cette règle : j'aimerais que toutes les requêtes vers le domaine /audio chemin no pour être redirigé.

J'ai écrit un RewriteCond et un RewriteRule pour faire cela mais ce n'est pas tout à fait correct et je n'arrive pas à comprendre pourquoi. L'expression régulière contient un lookahead négatif pour la chaîne "/audio", mais pour une raison quelconque, elle ne correspond pas. Voici la définition :

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net(?!/audio) [NC]
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301]

Si je change le RewriteCond en :

RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net/(?!audio) [NC]

(c'est-à-dire en plaçant la barre oblique à l'extérieur de la partie négative du lookahead), cela fonctionne, mais l'inconvénient est que les requêtes vers mydomain.net sans barre oblique de fin ne seront pas redirigées.

Quelqu'un peut-il m'indiquer ce que je fais mal ?

(Remarque : les crochets autour du domaine dans la règle de réécriture ci-dessus sont ajoutés par StackOverflow.com - ils ne figurent pas dans le code réel).


Voici les règles :

<VirtualHost *:80>
ServerAdmin me@mydomain.net
DocumentRoot "/var/www/mydomain.net/htdocs"
ServerName www.mydomain.net
ServerAlias mydomain.net

RewriteEngine on
RewriteCond {REQUEST_URI} !^/audio
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301]
RewriteLog logs/mod_rewrite_log
RewriteLogLevel 3

ErrorLog logs/error_log
CustomLog logs/access_log common
</VirtualHost>

Merci @mercutio -- c'est tout à fait logique mais cela ne semble toujours pas fonctionner.

Voici ce que dit le journal du mod_rewrite lorsque je fais une demande à http://mydomain.net/audio/something.mp3 :

(2) init rewrite engine with requested uri /audio/something.mp3
(3) applying pattern '^(.*)$' to uri '/audio'
(2) rewrite '/audio' -> 'http://www.newdomain.net/'
(2) explicitly forcing redirect with http://www.newdomain.net
(1) escaping http://www.newdomain.net for redirect
(1) redirect to http://www.newdomain.net [REDIRECT/301]

Puisque le REQUEST_URI commence avec /audio Je m'attendrais à ce que la RewriteRule soit ignorée.

49voto

mercutio Points 5828

Le HTTP_HOST ne contient que le nom d'hôte, et non le chemin de l'URL demandé.

RewriteCond %{REQUEST_URI} !^/audio

Ça devrait être tout ce dont vous avez besoin.

En outre, vous pouvez obtenir des informations de débogage du moteur de réécriture avec la commande suivante, ce qui est très utile pour voir comment vos conditions et vos règles sont mises en correspondance :

RewriteLog /path/to/log/file
RewriteLogLevel 3

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