2009-08-19 5 views
3

Итак, я делаю mod_rewrite, и я в ситуации, когда мне нужно, чтобы соответствовать любому поддомену, кроме одного. Это начинается так.Сопоставьте все поддомены, кроме одного в mod_rewrite

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

Таким образом, чтобы совместить и фиксировать единый поддомен, нет периодов. Но скажем, я не хочу соответствовать поддомену по имени «собака». Я попытался сделать это с таким негативным взглядом.

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

Это работает, по большей части. dog.example.com больше не подходит, что хорошо. Однако doggies.example.com также больше не соответствует. Это не хорошо.

Я смог исправить это, используя отрицательный lookahead в сочетании с негативным внешним видом.

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

Это работает. Насколько я могу судить, он работает отлично. Дело в том, что я не могу поверить, что это лучший способ достичь этого матча. Взгляд и взгляд сзади? В самом деле? Каков «правильный» способ достижения эквивалентного выражения?

ответ

8

Если вы хотите использовать отрицательный предпросмотр, вам нужно привязать выражение к точке:

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

В противном случае ничего, что начинается с dog, не допускается.

То же самое относится и к отрицательному назад ':

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

Закрепление его в начале строки с ^ будет гарантировать, что то, что просто заканчивается dog как catdog еще будет разрешено.

Другое решение аналогично тому, что упомянутый Винко Vrsalovic заключается в проверке того, что держит первое submatch:

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

+1, ты злой бобер :-) –

+0

Да, спасибо! – Apreche

1

Вы можете упростить вещи много используя отрицание оператора RewriteCond, как это:

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

Это нормально, но моя проблема является более сложной, чем это, так как у меня есть другие условия для нескольких поддоменов. – Apreche

+0

Хорошо, объясните, что в вашем вопросе. Знаете, люди обычно не читают мысли. –

+0

Кстати, у вас может быть одно отрицание для всех ваших условий в одном правиле RewriteCond% {HTTP_HOST}! (^ Dog \. |^Cat \.). Но, опять же, не зная сложной ситуации, сложно сказать, поможет ли это –

Смежные вопросы