Строка запроса прерывается, когда к параметру добавляется пробел

У меня есть следующий URL:

inspiratie/color-collections/test/test/S%200502-B/test

И правило перезаписи внутри web.config:

<rule name="color2">
  <match url="(kleur-en-inspiratie|inspiratie)/color-collections/([\S ^/]+)/([\S ^/]+)/([\S ^/]+)(/)?([\S ^/]*)" />
  <action type="Rewrite" logRewrittenUrl="true" appendQueryString="false" url="{R:1}/color-collections/color-detail?colorcollection={R:2}&amp;colorfamily={R:3}&amp;color={R:4}&amp;colorname={R:6}" />
</rule>

После того, как правило сработает, URL станет таким:

inspiratie/color-collections?colorcollection=test&colorfamily=test&color=S&colorname=

Но ожидаемый результат будет таким:

inspiratie/color-collections?colorcollection=test&colorfamily=test&color=S 0502-B&colorname=test

Как видите, если в коде цвета используется пробел, строка запроса прерывается после параметра цвета ({R:4}).

Когда я тестирую правило в IIS, оно работает нормально и возвращает ожидаемые результаты.

Я знаю, что неэкранированный пробел не будет работать, но ожидаю, что экранированный пробел сработает.


person Morpheus    schedule 23.11.2017    source источник


Ответы (1)


В вашем случае проблема возникает из-за кодировки. Вам нужно использовать переменную {UNENCODED_URL} для регулярного выражения. Правило должно быть таким:

<rule name="color2">
    <match url=".*" />
    <conditions>
        <add input="{UNENCODED_URL}" pattern="(kleur-en-inspiratie|inspiratie)/color-collections/([\S ^/]+)/([\S ^/]+)/([\S ^/]+)(/)?([\S ^/]*)" />
    </conditions>
    <action type="Rewrite" logRewrittenUrl="true" appendQueryString="false" url="{C:1}/color-collections/color-detail?colorcollection={C:2}&amp;colorfamily={C:3}&amp;color={C:4}&amp;colorname={C:6}" />                    
</rule>
person Victor Leontyev    schedule 05.01.2018
comment
Существует около 8000 цветовых вариаций. Насколько я понимаю, с вашим решением мне нужно будет перечислить все 8000 URL-адресов в <add input="{UNENCODED_URL}"...? - person Morpheus; 08.01.2018
comment
Вам это не нужно. Почему ты так думаешь? Это своего рода универсальное регулярное выражение, которое перепишет {VAR0}/color-collections/{VAR1}/{VAR2}/{VAR3}/{VAR4} в {VAR0}/color-collections?colorcollection={VAR1}&colorfamily={VAR2}&color={VAR3}&colorname={VAR4}. - person Victor Leontyev; 08.01.2018