Home mod_rewrite rule to redirect all requests except for one specific path
Reply: 0

mod_rewrite rule to redirect all requests except for one specific path

user2346
1#
user2346 Published in June 20, 2018, 7:35 am

I'm trying to redirect all requests to my domain to another domain using mod_rewrite in an Apache 2.2 VirtualHost declaration. There is one exception to this -- I'd like all requests to the /audio path not to be redirected.

I've written a RewriteCond and RewriteRule to do this but it's not quite right and I can't figure out why. The regular expression contains a negative lookahead for the string "/audio", but for some reason this isn't matching. Here's the definition:

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

If I change the RewriteCond to:

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

(i.e. put the forward slash outside of the negative lookahead part) then it works, but the downside of this is that requests to mydomain.net without a trailing slash will not be redirected.

Can anyone point out what I'm doing wrong?

(Note: the angle brackets around the domain in the RewriteRule bit above are being added by StackOverflow.com -- they are not there in the actual code!)


Here are the rules:

<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>

Thanks @mercutio -- that makes perfect sense but it still doesn't seem to work.

Here's what the mod_rewrite log says when I make a request to 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]

Since the REQUEST_URI does start with /audio I would expect the RewriteRule to be ignored.

You need to login account before you can post.

About| Privacy statement| Terms of Service| Advertising| Contact us| Help| Sitemap|
Processed in 0.329188 second(s) , Gzip On .

© 2016 Powered by mzan.com design MATCHINFO