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

StackOverflow https://stackoverflow.com/questions/19493

  •  09-06-2019
  •  | 
  •  

Question

J'essaie de rediriger toutes les requêtes de mon domaine vers un autre domaine en utilisant mod_rewrite dans une déclaration Apache 2.2 VirtualHost.Il y a une exception à cela : j'aimerais que toutes les demandes adressées au /audio chemin pas être redirigé.

J'ai écrit un RewriteCond et un RewriteRule pour ce faire, mais ce n'est pas tout à fait correct et je n'arrive pas à comprendre pourquoi.L'expression régulière contient une anticipation négative pour la chaîne "/audio", mais pour une raison quelconque, cela 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.placez la barre oblique en dehors de la partie d'anticipation négative), cela fonctionne, mais l'inconvénient est que les requêtes adressées à mydomain.net sans barre oblique finale ne seront pas redirigées.

Quelqu'un peut-il signaler ce que je fais de mal ?

(Note:les crochets angulaires autour du domaine dans le bit RewriteRule ci-dessus sont ajoutés par StackOverflow.com - ils ne sont pas là 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 -- cela est parfaitement logique mais cela ne semble toujours pas fonctionner.

Voici ce que dit le journal 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 par /audio Je m'attendrais à ce que le RewriteRule soit ignoré.

Était-ce utile?

La solution

Le HTTP_HOST contient uniquement le nom d'hôte, pas le chemin de l'URL demandée.

RewriteCond %{REQUEST_URI} !^/audio

Cela devrait être tout ce dont vous avez besoin.

De plus, vous pouvez obtenir des informations de débogage du moteur de réécriture avec les éléments suivants, ce qui est très utile pour voir comment vos conditions et règles correspondent :

RewriteLog /path/to/log/file
RewriteLogLevel 3
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top