Перезапись URL-адреса IIS, условное изменение URL-адреса

У меня есть набор из двух правил перезаписи URL-адресов IIS, основанных на автоматическом правиле «UserFriendlyURL». Суть этих двух правил состоит в том, чтобы взять первые два параметра строки запроса (Тип и Серия) и преобразовать их в удобный URL-адрес. Эта страница, если пользователь взаимодействует с поиском на ней, может отправить вас обратно на эту страницу, но с другими параметрами строки запроса, такими как «page» или «pageSize».

Я хочу, чтобы эти нетиповые/серийные параметры оставались параметрами строки запроса, поскольку они не являются частью удобного URL-адреса, но если эти элементы существуют, я хочу, чтобы страница прокручивалась вниз до объекта поиска (поскольку очевидно, что пользователь только что взаимодействовал с ним).

С этой целью я думаю, что я хочу добавить хэш местоположения (#search) в конец. Вместо того, чтобы просматривать каждый поисковый запрос на этой странице и вручную добавлять «#search» в конец (многие из них на самом деле являются действиями по клику, и я не хочу редактировать каждый метод JS, чтобы добавить это в конец сгенерированных URL-адресов ), было бы неплохо просто зафиксировать тот факт, что любой параметр строки запроса (кроме типа/серии) существует, и если это так, добавить «#search» в конец URL-адреса.

Выполнимо ли это, и если да, то как? Я знаю об условных выражениях в регулярных выражениях: http://www.regular-expressions.info/conditional.html< /а>

Но я не думаю, что в данном случае они сработают (буду рад ошибиться!)

<rewrite>
  <rules>
    <rule name="RedirectUserFriendlyURL1" stopProcessing="true">
      <match url="^(cn/)?/product-details$" />
      <conditions>
        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
        <add input="{QUERY_STRING}" pattern="^Type=([^=&amp;]+)&amp;Series=([^=&amp;]+)$" />
      </conditions>
      <action type="Redirect" url="{R:1}/product-details/{C:1}/{C:2}" appendQueryString="false" />
    </rule>
    <rule name="RewriteUserFriendlyURL1" stopProcessing="true">
      <match url="^(cn/)?/product-details/([^/]+)/([^/]+)$" />
      <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      </conditions>
      <action type="Rewrite" url="{R:1}/product-details?Type={URLEncode:{R:2}}&amp;Series={URLEncode:{R:3}}" />
    </rule>
  </rules>
</rewrite>

person ChristopherBass    schedule 04.03.2016    source источник


Ответы (1)


Итак, ответ на этот вопрос, насколько я могу судить: установка хеша, как я описал, невозможна с одним, но с двумя я могу перенаправить ^Type=([^=&amp;]+)&amp;Series=([^=&amp;]+)&amp;(.+) на другой URL-адрес, {R:1}/product-details/{C:1}/{C:2}?{C:3}#search. Здесь AppendQueryString имеет значение false, потому что я уже перехватываю другие строки запроса с помощью &amp;(.+) => ?{C:3}

Однако я также нашел альтернативное решение, заключающееся в том, чтобы просто использовать анимацию Javascript/JQuery, определить правильную ситуацию (в данном случае проверить наличие других строк запроса) в JavaScript, а затем заставить JS прокрутить до нужной привязки. Это позволяет вообще не использовать переписывание IIS и использовать минимальный javascript.

person ChristopherBass    schedule 15.03.2016