簡體   English   中英

匹配除mod_rewrite中的一個子域以外的所有子域

[英]Match all subdomains except one in mod_rewrite

好吧,所以我正在做一個mod_rewrite,而我正處於需要匹配除了一個子域之外的任何子域的情況。 它開始看起來像這樣。

RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]

這樣匹配並捕獲單個子域,沒有句點。 但是,讓我說我不想匹配名為'dog'的子域。 我嘗試用這樣的負面預測做到這一點。

RewriteCond %{HTTP_HOST} ^((?!dog)[^\.]+)\.example\.com$ [NC]

這在大多數情況下都有效。 dog.example.com不再匹配,這很好。 但是, doggies.example.com也不再匹配。 這是不好的。

我能夠通過使用負面前瞻和負面后視這樣來解決這個問題。

RewriteCond %{HTTP_HOST} ^((?!dog)[^\.]+(?<!dog))\.example\.com$ [NC]

這有效。 據我所知,它完美無缺。 問題是,我無法相信這是實現這場比賽的最佳方式。 前瞻后視? 真? 實現等效表達的“正確”方法是什么?

如果要使用負向前瞻,則需要將表達式錨定到點:

RewriteCond %{HTTP_HOST} ^((?!dog\.)[^.]+)\.example\.com$ [NC]

否則任何以dog開頭的東西都是不允許的。

這同樣適用於負面觀察:

RewriteCond %{HTTP_HOST} ^([^\.]+(?<!^dog))\.example\.com$ [NC]

它錨定到帶有字符串的開始^將確保東西,只是結尾dogcatdog還是被允許。

類似於Vinko Vrsalovic提到的另一個解決方案是測試第一個子匹配的內容:

RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC]
RewriteCond %1 !^dog$

使用RewriteCond的否定運算符可以簡化很多事情,如下所示:

RewriteCond %{HTTP_HOST} ^([^\.]+)\.mydomain\.com$ [NC]
RewriteCond %{HTTP_HOST} !^dog\. [NC]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM