Соответствует всем поддоменам, кроме одного в mod_rewrite - PullRequest
3 голосов
/ 19 августа 2009

Хорошо, я делаю 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]

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

Ответы [ 2 ]

9 голосов
/ 19 августа 2009

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

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$
1 голос
/ 19 августа 2009

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

RewriteCond %{HTTP_HOST} ^([^\.]+)\.mydomain\.com$ [NC]
RewriteCond %{HTTP_HOST} !^dog\. [NC]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...