简体   繁体   中英

Regex - how to match everything except a particular pattern

I'm using Apache and I want to redirect all received request to the ssl virtual host.

So I have the following line in the regular http virtual host:

RedirectMatch (.*) https://www.mydomain.com $1

which basicaly replace $1 by everything.

It works perfectly. But now, I need to access a particular CGI that cannot be on the SSL virtual host. So I would like to redirect all request, except the following:

" http://www.mydomain.com/mycgi/cgi.php "

I have search on this forum and found some post concerning regex exclusion, but none is working. Any help would be greatly appreciated.

Thanks. Alain

Apache 2.2 and later has negative lookahead support in regular expressions. If you are using Apache 2.2 or later this should work:

RedirectMatch ^/(?!mycgi/cgi.php)(.*) https://www.mydomain.com/$1

I believe the RedirectMatch is a short-circuit sorta deal . What this means, is that if you put another RedirectMatch ahead of your match-all, only the first match will execute. so something like...

RedirectMatch (/mycgi/cgi.php) http://www.mydomain.com$1 
RedirectMatch (.*) https://www.mydomain.com$1 

The previous answers are correct, but what if tomorrow there will be another exception? You'll get a fat, hard understand regex. Is better (easier to understand and maintain) to use an If directive expression with Apache internal variables.

<If "%{REQUEST_URI} !~ m#^/mycgi/cgi.php$# && \
     %{REQUEST_URI} !~ m#^/anothercgi/cgi.php$#">
    RedirectPermanent / https://%{HTTP_HOST}/%{REQUEST_URI}
</If>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM