Интеллектуальный UrlRewriter с RegEx не работает - PullRequest
2 голосов
/ 21 июля 2011

У меня есть следующее правило перезаписи:

<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>

, которое, как я ожидаю, должно работать с этим URL:

/Membership/Benefits/Member-Groups/Sub-Groups/Motorcycle-Live.aspx

Однако на моей странице этот перезаписанный URLсоответствует (/Membership/Index.aspx), я получаю FileName ("f" в моей строке запроса) и ParentFileName ("parentf" в моей строке запроса) для использования в запросе для получения информации о текущей странице.

  • Значение FileName в этом случае составляет Sub-Groups,Motorcycle-Live.aspx (когда я ожидал, что оно будет Motorcycle-Live.aspx)
  • Значение ParentFileName в этом случае равно Member-Groups (когда я ожидал, что это будут «Подгруппы»)

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

<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&amp;f=$2"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>

Они будут работать со следующими примерами URL (соответственно):

/Membership/Benefits.aspx
/Membership/Benefits/Member-Groups.aspx
/Membership/Benefits/Member-Groups/Sub-Groups.aspx

В этих случаях значения FileName и ParentFileName генерируются, как и ожидалось.Проблема возникает только на этой странице 5-го уровня.

Что я делаю не так?


РЕДАКТИРОВАТЬ

После удаления всех правил перезаписи в моем файле web.config, кроме этого:

<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>

Я обнаружил, что он работает сам по себе.Затем я попытался добавить их все по одному и менять порядок, пока он не заработал.Наконец я обнаружил, что работает следующий порядок правил:

<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>
<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&amp;f=$2"/>

Так что просто изменим порядок, за исключением того, что я сохранил первое правило в той же позиции.

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

Вместо всех опубликованных вами правил попробуйте следующее:

<rewrite url="^/Membership/([^/]+)$" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/([^/]+/)*([^/]+)/([^/]+)$" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>

Это должно избежать двусмысленности правила и имеет общее правило для произвольной глубины пути.

1 голос
/ 21 июля 2011

Альтернативное решение

После удаления всех правил перезаписи в моем web.config, кроме этого:

<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>

Я обнаружил, что это работает само по себе. Затем я попытался добавить их все по одному и изменить порядок, пока он не заработал. Наконец я обнаружил, что работает следующий порядок правил:

<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>

Так что просто изменим порядок, за исключением того, что я сохранил первое правило в той же позиции.

0 голосов
/ 21 июля 2011

Измените ваши правила: с такими широкими шаблонами (.+) вы должны начинать с самого длинного до более короткого:

<rewrite url="^/Membership/(.+)/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$3&amp;f=$4"/>
<rewrite url="^/Membership/(.+)/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$2&amp;f=$3"/>
<rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&amp;f=$2"/>
<rewrite url="^/Membership/(.+)" to="/Membership/Index.aspx?f=$1"/>

В качестве альтернативы, если вы хотите сохранить текущий порядок, заменитевсе вхождения (.+) в этих правилах в ([^/]+).

Проблема заключается в том, что это правило <rewrite url="^/Membership/(.+)/(.+)" to="/Membership/Index.aspx?parentf=$1&amp;f=$2"/> будет соответствовать ALL из этих URL:

/Membership/Benefits/Member-Groups.aspx
/Membership/Benefits/Member-Groups/Sub-Groups.aspx
/Membership/Benefits/Member-Groups/Sub-Groups/Motorcycle-Live.aspx

И если у вас есть правила в текущем порядке (сначала «короче»), «более длинные» правила просто никогда не будут оцениваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...