IIS делает URL Rewrite жадным

Я хотел бы создать общее правило перезаписи URL-адресов в IIS 7.5 (в Windows Web Server 2008 R2).

Я хотел бы сопоставить следующие URL-адреса:

www.mysite.com/param
www.mysite.com/folder1/
www.mysite.com/folder1/param
www.mysite.com/folder1/folder2/
www.mysite. com/folder1/folder2/параметр

Обратите внимание на завершающую косую черту (/), когда я хочу сопоставить папку, иначе это параметр.

Я установил следующее правило перезаписи:

^(?:([^/]+)/)?(?:([^/]+)/)?([^/]+)?$

Он имеет три совпадающих предложения: {R:1}, {R:2} и {R:3}. Однако, когда я ввожу следующий тестовый URL-адрес:

папка1/параметр

Я получаю следующий ответ:

{R:1} пусто
{R:2} = папка1
{R:3} = параметр

Я подозревал следующий ответ:

{R:1} = папка1
{R:2} пуста
{R:3} = параметр

т.е. Я хочу, чтобы folder1 была сопоставлена ​​с первой частью шаблона перезаписи.

Я хотел бы сопоставить правило перезаписи с:

/controller.php?folder1={R:1}&folder2={R:2}&param={R:3}

Чего мне не хватает, чтобы совпадение было жадным, то есть соответствовало первому возможному предложению?


person Gedde    schedule 26.11.2010    source источник


Ответы (1)


Я не знаю, как сделать необязательный квантификатор ("?") жадным в IIS. Но я бы попытался сделать совпадение однозначным, включив второе необязательное предложение в первое.

Поэтому вместо того, чтобы иметь первые два варианта рядом, как в исходной пробной версии:

^(?:([^/]+)/)?(?:([^/]+)/)?([^/]+)?$

Я предлагаю это:

^(?:([^/]+)/(?:([^/]+)/)?)?([^/]+)?$

Теперь вторая группа может совпасть только в том случае, если первая совпала.

person Christian Semrau    schedule 26.11.2010
comment
Это работает. Я не хотел переходить к этому шагу, потому что моя реальная проблема имеет 4 уровня (а не только два, указанные в вопросе для иллюстрации проблемы), но, тем не менее, это кажется хорошим решением. - person Gedde; 27.11.2010