6

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

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

重定向匹配 (.*) https://www.mydomain.com $1

它基本上用所有东西代替了 $1。

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

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

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

谢谢。阿兰

4

3 回答 3

3

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

RedirectMatch ^/(?!mycgi/cgi.php)(.*) https://www.mydomain.com/$1
于 2010-04-26T20:52:12.673 回答
1

我相信 RedirectMatch 是一个短路排序交易。这意味着,如果您在全匹配之前放置另一个 RedirectMatch,则只会执行第一个匹配。所以像...

RedirectMatch (/mycgi/cgi.php) http://www.mydomain.com$1 
RedirectMatch (.*) https://www.mydomain.com$1 
于 2010-04-26T20:35:29.243 回答
0

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

<If "%{REQUEST_URI} !~ m#^/mycgi/cgi.php$# && \
     %{REQUEST_URI} !~ m#^/anothercgi/cgi.php$#">
    RedirectPermanent / https://%{HTTP_HOST}/%{REQUEST_URI}
</If>
于 2019-11-01T14:15:03.140 回答