[英]Regex - how to match everything except a particular pattern
我正在使用 Apache,我想將所有收到的請求重定向到 ssl 虛擬主機。
所以我在常規 http 虛擬主機中有以下行:
RedirectMatch (.*) https://www.mydomain.com $1
這基本上用所有東西代替了 1 美元。
它完美地工作。 但是現在,我需要訪問無法在 SSL 虛擬主機上的特定 CGI。 所以我想重定向所有請求,除了以下內容:
" http://www.mydomain.com/mycgi/cgi.php "
我在這個論壇上搜索過,發現了一些關於正則表達式排除的帖子,但沒有一個有效。 任何幫助將不勝感激。
謝謝。 阿蘭
Apache 2.2 及更高版本在正則表達式中具有負前瞻支持。 如果您使用的是 Apache 2.2 或更高版本,這應該可以工作:
RedirectMatch ^/(?!mycgi/cgi.php)(.*) https://www.mydomain.com/$1
我相信 RedirectMatch 是一筆短路交易。 這意味着,如果您在全匹配之前放置另一個 RedirectMatch,則只會執行第一個匹配。 所以像...
RedirectMatch (/mycgi/cgi.php) http://www.mydomain.com$1
RedirectMatch (.*) https://www.mydomain.com$1
前面的答案是正確的,但如果明天又出現一個例外呢? 你會得到一個胖的,難以理解的正則表達式。 使用帶有 Apache 內部變量的If指令表達式更好(更易於理解和維護)。
<If "%{REQUEST_URI} !~ m#^/mycgi/cgi.php$# && \
%{REQUEST_URI} !~ m#^/anothercgi/cgi.php$#">
RedirectPermanent / https://%{HTTP_HOST}/%{REQUEST_URI}
</If>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.