![](/img/trans.png)
[英]How to redirect all URLs except one path and all its subpaths without 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]
它錨定到帶有字符串的開始^
將確保東西,只是結尾dog
像catdog
還是被允許。
類似於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.