正则表达式 - 如何匹配除特定模式之外的所有内容

时间:2010-04-26 20:18:46

标签: regex ssl apache-config

我正在使用Apache,我想将所有收到的请求重定向到ssl虚拟主机。

所以我在常规的http虚拟主机中有以下行:

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

基本上取而代之的是一切。

完美无缺。但现在,我需要访问不能在SSL虚拟主机上的特定CGI。所以我想重定向所有请求,除了以下内容:

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

我在这个论坛上搜索并发现了一些关于正则表达式排除的帖子,但没有一个是有效的。任何帮助将不胜感激。

感谢。 阿兰

3 个答案:

答案 0 :(得分:2)

Apache 2.2及更高版本在正则表达式中具有负前瞻支持。如果您使用的是Apache 2.2或更高版本,则应该可以使用:

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

答案 1 :(得分:1)

我相信RedirectMatch是short-circuit sorta deal。这意味着,如果你将另一个RedirectMatch放在match-all之前,那么只会执行第一个匹配。所以... ...

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

答案 2 :(得分:0)

先前的答案是正确的,但是如果明天还会有另一个例外呢?您会得到一个胖的,很难理解的正则表达式。最好(易于理解和维护)将 If 指令表达式与Apache内部变量一起使用。

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