Регулярное выражение для перезаписи URL с необязательными параметрами строки запроса

У меня есть это правило перезаписи:

<rule name="rentals by proptype+state+city+street test" stopProcessing="true">
  <match url=".*" />
  <conditions>
    <add input="{UNENCODED_URL}" pattern="^/([a-zA-Z0-9\-+]+)/rent/province/([a-zA-Z\-+]+)/street/([a-zA-Z0-9%\-+]+)/([0-9a-zA-Z%\-+']+)$" />
  </conditions>
  <action type="Rewrite" url="search_new.aspx?proptype={C:1}&amp;province={C:2}&amp;city={C:3}&amp;street={C:4}" appendQueryString="true" />
</rule>

Я также пробовал:

<rule name="rentals by proptype+state+city+street test" stopProcessing="true">
  <match url=".*" />
  <conditions>
    <add input="{UNENCODED_URL}" pattern="^/([a-zA-Z0-9\-+]+)/rent/province/([a-zA-Z\-+]+)/street/([a-zA-Z0-9%\-+]+)/([0-9a-zA-Z%\-+']+)$" />
    <add input="{QUERY_STRING}" pattern=".*" />
  </conditions>
  <action type="Rewrite" url="search_new.aspx?proptype={C:1}&amp;province={C:2}&amp;city={C:3}&amp;street={C:4}" appendQueryString="true" />
</rule>

Этот URL работает: http://www.example.com/apartment/rent/province/texas/street/houston/mystreet
Но когда я добавляю параметры строки запроса, URL выдает 404: http://www.example.com/apartment/аренда/провинция/техас/улица/хьюстон/mystreet?rooms=3&pricemin=2500

Я уже проверял здесь:
IIS URL Rewrite не работает со строкой запроса
https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference
https://msdn.microsoft.com/en-us/library/ms972974.aspx

Кажется, мне нужно использовать QUERY_STRING серверную переменную. На самом деле я просто хочу добавить параметры строки запроса, без необходимости писать специальное сопоставление для каждого параметра. Я думал, что могу решить эту проблему с помощью свойства appendQueryString="true", но это явно не работает.

Как я могу убедиться, что мое правило перезаписи работает также с параметрами строки запроса?


person Flo    schedule 14.09.2017    source источник


Ответы (1)


Когда я смотрю на ваше правило, я понимаю, что вы ищете полное совпадение (^...$) с путем URL.

Однако {UNENCODED_URL} может также содержать строки запроса . Таким образом, это нарушает ваше правило, когда URL-адрес содержит любую строку запроса, даже если это просто разделитель запроса (?).

Чтобы исправить это, вы должны искать совпадение до начала строки запроса, а не до конца.

Попробуйте следующее правило.

<rule name="rentals by proptype+state+city+street test" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{UNENCODED_URL}" pattern="^/([a-zA-Z0-9\-+]+)/rent/province/([a-zA-Z\-+]+)/street/([a-zA-Z0-9%\-+]+)/([0-9a-zA-Z%\-+']+)" />
    </conditions>
    <action type="Rewrite" url="search_new.aspx?proptype={C:1}&amp;province={C:2}&amp;city={C:3}&amp;street={C:4}" appendQueryString="true" />
</rule>
person Kul-Tigin    schedule 17.09.2017
comment
Юп, вот и все. Спасибо, наградим через 23 часа :-) - person Flo; 17.09.2017