Модуль перезаписи URL-адресов IIS 7.5 - перезапись карт с переменными

У меня есть несколько страниц на моем сайте с длинными и нечитаемыми URL-адресами, которые я бы хотел сократить. Проблема, с которой я столкнулся, заключается в добавлении строк запроса со значениями переменных.

Например: «www.example.com/dir1/dir2/filename.php» сокращается до «www.example.com/file». «www.example.com/dir1/dir2/filename.php?id=2» будет «www.example.com/file/2». «www.example.com/dir1/dir2/filename.php?id=2&alt=6» будет «www.example.com/file/2/6».

Значения id и alt затем используются нашей страницей для доступа к информации в нашей базе данных, которая определяет содержимое страницы. Эти значения могут меняться, и нет установленной суммы.

Прямо сейчас у меня есть первый пример, нормально работающий со следующими правилами перезаписи:

<rewrite>
        <outboundRules>
            <remove name="OutboundRewriteUserFriendlyURL1" />
        </outboundRules>
        <rewriteMaps>
            <rewriteMap name="StaticRewrites">
                <add key="/file" value="/dir1/dir2/filename.php" />                    
            </rewriteMap>
        </rewriteMaps>
      <rules>
        <rule name="Rewrite Rule">
          <match url=".*" />
          <conditions>
            <add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
          </conditions>
          <action type="Rewrite" url="{C:1}" />
        </rule>
      </rules>
</rewrite>

Но мне не удалось найти ничего, что позволило бы URL-адресам содержать переменные. Во всем, что я видел, использовались статические перезаписи, как в моем текущем решении, и я не могу найти ничего о разрешении произвольных параметров.

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

Нашел лучшее решение, которое не использует карту перезаписи. Раньше я пробовал использовать похожее правило, но из-за настройки IIS в нашей тестовой среде оно работало не так, как ожидалось. Эта версия должна работать для большинства людей.

<rule name="Curricula View" stopProcessing="true">
    <match url="/file(?:/(\d+)(?:/(\d+))?)?" />
    <action type="Rewrite" url="/dir1/dir2/filename.php?id={R:1}&alt={R:2}" appendQueryString="true" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
</rule>

person chrisc    schedule 07.08.2014    source источник
comment
Если вы нашли решение, запишите его как ответ, не записывайте решение в вопросе.   -  person Kev    schedule 07.08.2014
comment
Я не могу ответить на свой вопрос еще 7 часов.   -  person chrisc    schedule 07.08.2014


Ответы (1)


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

<rule name="Curricula View" stopProcessing="true">
    <match url="/file(?:/(\d+)(?:/(\d+))?)?" />
    <action type="Rewrite" url="/dir1/dir2/filename.php?id={R:1}&alt={R:2}" appendQueryString="true" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
</rule>

РЕДАКТИРОВАТЬ: Я также смог получить оригинальную версию с переписанной картой, работающей для всех, кого это интересует.

<rule name="Rewrite Map with Variables" enabled="true">
    <match url="^(.+?)/?/(.*)$" />
    <conditions logicalGrouping="MatchAny" trackAllCaptures="false">
        <add input="{ProductMap:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="/dir1/dir2/filename.php?id={C:0}&amp;other={R:2}" appendQueryString="true" />
</rule>
person chrisc    schedule 11.08.2014