Добавить строку запроса на карту перезаписи IIS - PullRequest
9 голосов
/ 17 января 2011

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

Например:

  • / page / abc / --> /index.cfm?page=abc (работает)
  • / page / abc /? param1 = 111 ---> /index.cfm?page=abc¶m1=111 (не работает)
  • / page / abc /? Param3 = 333¶m4 = 444 ---> /index.cfm?page=abc¶m3=333¶m4= 444 (не работает)

Мой web.config:

[...]
<rules>
    <clear />
    <rule name="Rewrite rule1 for SiteMapEngine">
        <match url=".*" />
        <conditions>
            <add input="{SiteMapEngine:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Rewrite" url="{C:1}" appendQueryString="true" />
    </rule>
</rules>
[...]

Ответы [ 3 ]

24 голосов
/ 13 марта 2012

Краткий ответ:

Используйте переменную сервера PATH_INFO вместо REQUEST_URI, так как вы не хотите включать строку запроса в соответствие.

Полное объяснение:

Это меня уже поразило - в основном это тонкость использования Rewrite Maps в модуле перезаписи URL IIS.

В вашем случае SiteMapEngine будет статическим списком URL-значений ключей:

<rewrite>
    <rewriteMaps>
        <rewriteMap name="SiteMapEngine" defaultValue="">
            <add key="/page/abc/" value="/index.cfm?page=abc" />
            ...
        </rewriteMap>
    </rewriteMaps>
    ...
</rewrite>

Условие {SiteMapEngine: {REQUEST_URI}} в вашем правиле проверяет, есть ли ключ в этой карте перезаписи, соответствующий серверной переменной REQUEST_URI:

{REQUEST_URI} = /page/abc/?param1=111

Обратите внимание, что эта переменная содержит строку запроса - поэтому ей не удается найти соответствующий ключ.

Вместо этого используйте переменную сервера PATH_INFO, которая является эквивалентом REQUEST_URI, но без строки запроса :

{PATH_INFO} = /page/abc/

Итак, правильное правило:

<rule name="Rewrite rule1 for SiteMapEngine">
    <match url=".*" />
    <conditions>
        <add input="{SiteMapEngine:{PATH_INFO}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="{C:1}" />
</rule>
11 голосов
/ 18 марта 2011

Буду проклят, если смогу найти ссылку на это, но, насколько я понимаю, в некоторых версиях IIS {REQUEST_URI} возвращается без строки запроса и будет полностью пустым, если включено перезапись.

Вместо этого вы сможете использовать {PATH_INFO}.

Этот отчет об ошибке (против Drupal!) - это проблема, которую вы описываете, я думаю: http://drupal.org/node/298016

ЕстьИсправление от Microsoft, но я не пробовал: http://support.microsoft.com/kb/954946

0 голосов
/ 09 февраля 2011

Вот мое правило.Кажется, работает как ожидалось:

<rule name="Insert index.cfm" enabled="true" stopProcessing="true">
    <match url="^(.*)$" ignoreCase="false" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="index.cfm/{PATH_INFO}" appendQueryString="true" />
</rule> 
...