Проблема
При использовании функции интерфейса общего шлюза IIS (CGI) для размещения исполняемой программы, которая использует определенную библиотеку для перенаправления запросов, запросы могут быть неправильно направлены на основе наличия заголовка запроса PROXY. Известно, что эту библиотеку используют несколько платформ веб-приложений. К ним относятся, среди прочего, PHP, Python и Go.
Причина
CGI — это интерфейс, позволяющий веб-серверу размещать приложения, которые выполняются как исполняемые процессы. Когда запрос получен веб-сервером, сервер запускает новый процесс обработки этого одного запроса. По завершении запроса процесс завершается. Чтобы у процесса был доступ к данным запроса, заголовки запросов включаются в качестве переменных среды, к имени которых добавляется "HTTP_". Таким образом, процессы CGI для запросов, содержащих заголовок с именем Proxy, имеют переменную среды "HTTP_PROXY", которая имеет то же значение, что и заголовок запроса.
Командная строка и библиотека cURL обычно используются для того, чтобы различные типы приложений могли отправлять запросы к различным типам серверов, включая веб-серверы. Эту библиотеку можно настроить с помощью параметров командной строки или считывать параметры конфигурации из переменных среды хост-процесса. "HTTP_PROXY" является одним из многих параметров конфигурации, используемых cURL. "HTTP_PROXY" используется cURL для отправки HTTP-запроса через настроенный прокси-сервер.
Примечание. Это не связано с "HTTP_PROXY" в качестве представления заголовка запроса клиента.
Если cURL размещается в процессе CGI и этот процесс содержит переменную среды с именем "HTTP_PROXY", cURL использует свое значение для отправки запрошенных данных через прокси-сервер HTTP, значение которого указано в переменной среды. Это происходит потому, что cURL ожидает, что "HTTP_PROXY" является директивой конфигурации, а не заголовком запроса клиента.
Временное решение
Чтобы обойти эту проблему, не используйте CGI на сервере под управлением IIS. CGI — это в значительной степени устаревший интерфейс, который заменен более новыми интерфейсами, связанными с производительностью. В частности, PHP, Python и Go должны размещаться через FastCGI в IIS. FastCGI не использует переменные среды для заголовков клиентских запросов и не имеет этой проблемы. Однако для PHP некоторые приложения могут использовать функцию getenv() PHPs для получения переменных среды. Даже если PHP не размещен в процессе CGI, он реплицирует поведение CGI путем внедрения значений заголовков запроса в набор данных, доступных его функции getenv(). Если вы используете приложение PHP, которое получает HTTP_PROXY таким образом, в силу действуют следующие способы очистки значения заголовка или отклонения запросов с заголовком PROXY.
Если вам по какой-то причине нужно использовать CGI, либо блокируйте запросы, содержащие заголовок запроса с именем Proxy, либо очистите значение заголовка. Это связано с тем, что "Proxy" не является стандартным именем заголовка запроса, и браузеры, как правило, не отправляют его.
Чтобы заблокировать запрос, содержащий заголовок Proxy (предпочтительное решение), выполните следующую командную строку:
appcmd set config /section:requestfiltering /+requestlimits.headerLimits. [header='proxy',sizelimit='0']
Примечание. Обычно appcmd.exe не находится в пути и находится в каталоге %systemroot%\system32\inetsrv.
Чтобы очистить значение заголовка, можно использовать следующее правило перезаписи URL-адресов:
<system.webServer>
<rewrite>
<rules>
<rule name="Erase HTTP_PROXY" patternSyntax="Wildcard">
<match url="*.*" />
<serverVariables>
<set name="HTTP_PROXY" value="" />
</serverVariables>
<action type="None" />
</rule>
</rules>
</rewrite>
</system.webServer>
Примечание Перезапись URL-адресов — это загружаемая надстройка в IIS и не включена в установку IIS по умолчанию.