Не удается получить IIS URL переписать дескриптор% 3F в URL - PullRequest
1 голос
/ 30 января 2012

Я использую URL Rewrite, чтобы отправить все запросы на ci.pl на созданный мной прокси (запрос имеет ci.pl, затем перенаправить на: /proxy/handler.ashx; добавить строку запроса: да ). Работает отлично. По-видимому, есть действительно старое клиентское приложение, которое отправляет следующие запросы: http://webserver.com/ci.pl%3F4+505000+0+0+5

Когда должно быть отправлено: http://myserver.com/ci.pl?4+505000+0+0+5

В итоге происходит то, что правило ci.pl перенаправляет на прокси-сервер, но, поскольку ? принимается как % 3F , параметры отсутствуют включен в редирект.

Я не могу обновить устаревшее клиентское приложение, поэтому я пытался придумать правило перезаписи URL-адреса, чтобы обнаружить % 3F + проход по строке справа от % 3F . Кто-нибудь делал что-то подобное?

Вот конфигурация, которая близка, но строка справа от % 3F не передается прокси.

<rewrite>
    <rules>
        <clear />
        <rule name="Handle %3F" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
            <match url="*" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{QUERY_STRING}" pattern="*ci.pl%3F*" />
            </conditions>
            <action type="Redirect" url="/proxy/handler.ashx?{C:2}" appendQueryString="false" />
        </rule>
        <rule name="Detect CI.PL">
            <match url="(.*)" />
            <conditions>
                <add input="{PATH_INFO}" pattern="ci.pl" />
            </conditions>
            <action type="Rewrite" url="/proxy/handler.ashx" />
        </rule>
    </rules>
</rewrite>

1 Ответ

1 голос
/ 30 января 2012

У меня сработало следующее:

Соответствующий URL

  • Запрошенный URL: соответствует шаблону
  • Использование: регулярные выражения
  • Шаблон: ^ci\.pl(%3f|\?)(.*)
  • Игнорировать регистр: Да

Действие

  • Тип действия: Перенаправление
  • URL перенаправления: http://myserver.com/ci.pl?{R:2}
  • Добавить строку запроса: Нет

Вот как это работает. Приведенное выше регулярное выражение объединяет URI, начиная с ci.pl, за которым следует либо %3f или ? с последовательностью произвольных символов после этого. Последовательность захвачена и может быть позже названа {R:2} (2 означает «второй набор скобок, начинающийся слева»).

Например, если URI равен http://webserver.com/ci.pl%3F4+505000+0+0+5,, то {R: 1} и {R: 2} будут содержать %3F и 4+505000+0+0+5 соответственно, что даст результат http://myserver.com/ci.pl?4+505000+0+0+5, как и ожидалось .

Вот фрагмент файла конфигурации:

<rewrite>
    <rules>
        <rule name="ci" stopProcessing="true">
            <match url="^ci\.pl(%3f|\?)(.*)" />
            <action type="Redirect" url="http://myserver.com/ci.pl?{R:2}" appendQueryString="false" />
        </rule>
    </rules>
</rewrite>

Надеюсь, это поможет.

...