Перезапись URL — адреса IIS-URL частично декодируется в процессе перезаписи

#iis #url-rewriting

Вопрос:

У меня работает служба API, которая принимает различные вызовы API с длинной строкой параметров, которая работает. Недавно я создал сайт перенаправления IIS в качестве посредника для поддержки https, где система API поддерживает только http-вызовы. Процесс перезаписи https работает нормально. Однако я заметил, что процесс перезаписи URL-адреса IIS частично декодирует URL-адрес перед отправкой его в службу API, где службе не удается декодировать URL-адрес. Сведения о вызове API следующие:

Прямой вызов службы API(это отлично работает)

Исходный URL-адрес: http://10.0.0.119:8041/datasnap/rest/TTransactionsModule/GetTransactions/»[{«FilterTypeID»:6001,»NotOperator»:false,»SortOrder»:0,»StartGroup»:0,»EndGroup»:0,»Values»:[«SO»],»OperatorType»:»operator_Equals»,»SortType»:»SortType_Ascending»,»LogicOp»:»LogicOp_And»,»IsValid»:»False»,»RefCount»:»0″,»Changed»:false},{«FilterTypeID»:6003,»StartGroup»:1,»EndGroup»:1,»AvailableOperators»:[],»NotOperator»:false,»OperatorType»:»operator_Between»,»Values»:[«13/05/2021″,»11/08/2021″],»LogicOp»:»LogicOp_And»,»SortOrder»:1,»SortType»:»SortType_Descending»,»IsValid»:»False»,»RefCount»:»0″}]»/1/1/false

Декодированный URL-адрес (Пожалуйста, обратите внимание, что кодирование необходимо выполнить для отправки дат, попадающих в URL-адрес):

http://10.0.0.119:8041/datasnap/rest/TTransactionsModule/GetTransactions/»[{«FilterTypeID»:6001,»NotOperator»:false,»SortOrder»:0,»StartGroup»:0,»EndGroup»:0,»Values»:[«SO»],»OperatorType»:»operator_Equals»,»SortType»:»SortType_Ascending»,»LogicOp»:»LogicOp_And»,»IsValid»:»False»,»RefCount»:»0″,»Changed»:false},{«FilterTypeID»:6003,»StartGroup»:1,»EndGroup»:1,»AvailableOperators»:[],»NotOperator»:false,»OperatorType»:»operator_Between»,»Values»:[«13/05/2021″,»11/08/2021″],»LogicOp»:»LogicOp_And»,»SortOrder»:1,»SortType»:»SortType_Descending»,»IsValid»:»False»,»RefCount»:»0″}]»/1/1/false

Раздел параметров, который получает служба API:

«[{«FilterTypeID»:6001,»NotOperator»:false,»SortOrder»:0,»StartGroup»:0,»EndGroup»:0,»Values»:[«SO»],»OperatorType»:»operator_Equals»,»SortType»:»SortType_Ascending»,»LogicOp»:»LogicOp_And»,»IsValid»:»False»,»RefCount»:»0″,»Changed»:false},{«FilterTypeID»:6003,»StartGroup»:1,»EndGroup»:1,»AvailableOperators»:[],»NotOperator»:false,»OperatorType»:»operator_Between»,»Values»:[«13/05/2021″,»11/08/2021″],»LogicOp»:»LogicOp_And»,»SortOrder»:1,»SortType»:»SortType_Descending»,»IsValid»:»False»,»RefCount»:»0″}]»

Вызов службы API через процесс перезаписи IIS:

Исходный URL-адрес, который передается на сайт ISS (точно такой же вызов, кроме https и dns) :

https://10.0.0.119:9015/datasnap/rest/TTransactionsModule/GetTransactions/»[{«FilterTypeID»:6001,»NotOperator»:false,»SortOrder»:0,»StartGroup»:0,»EndGroup»:0,»Values»:[«SO»],»OperatorType»:»operator_Equals»,»SortType»:»SortType_Ascending»,»LogicOp»:»LogicOp_And»,»IsValid»:»False»,»RefCount»:»0″,»Changed»:false},{«FilterTypeID»:6003,»StartGroup»:1,»EndGroup»:1,»AvailableOperators»:[],»NotOperator»:false,»OperatorType»:»operator_Between»,»Values»:[«13/05/2021″,»11/08/2021″],»LogicOp»:»LogicOp_And»,»SortOrder»:1,»SortType»:»SortType_Descending»,»IsValid»:»False»,»RefCount»:»0″}]»/1/1/false

Раздел параметров, который служба API получает от процесса перезаписи ISS:

«[{«FilterTypeID»:6001,»NotOperator»:false,»SortOrder»:0,»StartGroup»:0,»EndGroup»:0,»Values»:[«SO»],»OperatorType»:»operator_Equals»,»SortType»:»SortType_Ascending»,»LogicOp»:»LogicOp_And»,»IsValid»:»False»,»RefCount»:»0″,»Changed»:false},{«FilterTypeID»:6003,»StartGroup»:1,»EndGroup»:1,»AvailableOperators»:[],»NotOperator»:false,»OperatorType»:»operator_Between»,»Values»:[«13/05/2021″,»11/08/2021″],»LogicOp»:»LogicOp_And»,»SortOrder»:1,»SortType»:»SortType_Descending»,»IsValid»:»False»,»RefCount»:»0″}]»

Когда разделы параметров сравниваются в любом случае, становится ясно, что URL-адрес, восстановленный с помощью процесса перезаписи IIS, декодировал некоторые символы, такие как «:» и», » (пример: около 6001 в разделе параметров)

Может кто-нибудь помочь мне решить эту проблему. Необходимо настроить процесс перезаписи IIS для передачи точного списка параметров URL, который он получил, в службу API без какого-либо декодирования или кодирования.

Мое содержимое файла web.config для перезаписи IIS выглядит следующим образом (обратите внимание, что необходимо установить значения maxRequestLength, maxUrlLength, maxQueryStringLength для длинных URL-адресов и requestValidationMode=»2.0″ для поддержки проверки URL-адресов cirtan)

     <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:8041/{R:1}" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
    <system.web>
        <httpRuntime maxRequestLength="2097151" maxUrlLength="2097151" maxQueryStringLength="2097151" requestValidationMode="2.0" />
    </system.web>
</configuration>
 

Заранее спасибо,
Дэн

Ответ №1:

В iis есть флаг функции, useOriginalURLEncoding, который позволяет отключить эту несоответствующую кодировку URL-адреса, если установлено значение true.

Чтобы установить флажок «Перейти IIS Manager «, затем выберите Configuration Editor и перейдите в раздел system.webServer/rewrite/rules , где вы найдете useOriginalURLEncoding флаг, установите флаг в значение false, и перезапись URL-адреса больше не будет кодировать URL-адрес.

Комментарии:

1. Спасибо вам за ответ. Я установил значение useOriginalURLEncoding в значение false. Я даже перезапустил сервер, чтобы убедиться в этом. Но все равно у меня та же проблема.

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