Пожалуйста, помогите мне разобраться в перезаписи карт, у меня такая настройка:
<rewriteMap name="MyMap">
<add key="/pages" value="/website/pages/index.aspx" />
<add key="/pages/page-1" value="/website/pages/page-1/index.aspx" />
<add key="/pages/page-1/section-1" value="/website/pages/page-1/section-1.aspx" />
</rewriteMap>
Вот мое правило:
<rule name="Rewrite rule for MyMap" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{MyMap:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>
Это сработает, если я попытаюсь получить доступ к этим страницам:
Но мне нужна возможность добавить строку запроса на любую из этих страниц, например:
Когда я пытаюсь открыть эту страницу, я получаю 404. Как я могу заставить это работать?
По умолчанию правила перезаписи URL с использованием карт перезаписи создаются в соответствии с {REQUEST_URI} переменная. Это включает URL + строку запроса. Это позволяет сопоставлять URL-адреса с параметрами строки запроса и перезаписывать их на другие страницы. Очень удобно, но это явно не то, что вам нужно.
Вы хотите сопоставить только URL без строки запроса. Чтобы изменить это, вам нужно заменить {REQUEST_URI} в состоянии {URL}. Тогда только URL (без строки запроса) будет сопоставлен с картой перезаписи. Затем вы можете добавить строку запроса к перезаписанному URL-адресу, чтобы выполняемый скрипт все еще имел к нему доступ.
В итоге вы получите такое правило:
<rule name="Rewrite rule for MyMap">
<match url=".*" />
<conditions>
<add input="{MyMap:{URL}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>
Вместо того, чтобы использовать
<add input="{MyMap:{URL}}" pattern="(.+)" />
Вы также можете попробовать
<add input="{MyMap:{SCRIPT_NAME}}" pattern="(.+)" />
Посмотреть здесь:
Не удается получить статические перенаправления для работы с IIS Url Rewrite 2.0