Чтение групп захвата из Regex, которые также являются правилами перезаписи URL?возможный? - PullRequest
3 голосов
/ 09 декабря 2011

С учетом правила перезаписи URL, например:

 <rule name="RewriteUserFriendlyThings" stopProcessing="true">
        <match url="^cat/sub-cat/(\d+)/([^/]+)/?$" />
        <conditions>
          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="cat/sub-cat/detail.aspx?id={R:2}" />
      </rule>

В коде C # мне нужно прочитать значение во второй группе шаблона (это мой идентификатор) для кнопки «Закладка» (donне спрашивать) работать со страницами, которые являются динамическими, как это.Я использую определенную CMS, которая работает во время публикации, и мы пропустили создание закладок для динамического контента.

Итак, я сделал, загрузив web.config в формате XML и сопоставив текущий URL, основываясьнаходится в атрибуте url элемента match.Тем не менее, я не могу понять, как добраться до группы.Учитывая, что это должно быть общим, чтобы в другом правиле группа могла быть третьей или первой группой.

У меня есть белый список правил, против которых я делаю это.

Я пытался использовать группы захвата (?<id>\d+), но web.config их не разрешает.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Я обошел это, используя функцию «Переменные сервера» модуля перезаписи URL-адреса IIS 7.

Я определил новую разрешенную серверную переменную, а затем зафиксировал значение, которое мне было нужно, таким образом, используяСинтаксис перезаписи URL IIS {R:2}.Затем я мог бы получить доступ к значению, используя коллекцию HttpContext.Request.ServerVariables.

1 голос
/ 09 декабря 2011

Идея использования именованных групп кажется достаточно хорошим способом решения гибких правил. В настоящее время у меня нет доступа к тестированию правил перезаписи в IIS, но вы можете попробовать использовать альтернативный подход к именам захваченных групп. Может быть, это пройдет.

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

(?'id'\d+)
...