Совпадение со всеми субдоменами, кроме одного, в mod_rewrite

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

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

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

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

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

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

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

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


person Apreche    schedule 19.08.2009    source источник


Ответы (2)


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

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

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

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

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

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

Другое решение, похожее на то, что упомянул Винко Врсалович, состоит в том, чтобы проверить, что содержит первый подматч:

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

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

RewriteCond %{HTTP_HOST} ^([^\.]+)\.mydomain\.com$ [NC]
RewriteCond %{HTTP_HOST} !^dog\. [NC]
person Vinko Vrsalovic    schedule 19.08.2009
comment
Это нормально, но моя проблема сложнее, поскольку у меня есть другие условия для нескольких поддоменов. - person Apreche; 19.08.2009
comment
Хорошо, объясните это в своем вопросе. Люди обычно не читают мысли, понимаете? - person Vinko Vrsalovic; 19.08.2009
comment
Кстати, вы можете иметь одно отрицание для всех ваших условий в одном правиле RewriteCond %{HTTP_HOST} !(^dog\.|^cat\.). Но опять же, не зная вашей сложной ситуации, трудно сказать, поможет ли это. - person Vinko Vrsalovic; 19.08.2009