У меня есть очень длинный URL-адрес на сайте, размещенном на Windows 2003 x64, который выглядит следующим образом:
http://myhost/a_very_very_long_url_around_300_chars_long
(т.е. один очень длинный сегмент длиной около 300 символов)
Проблема в том, что я получаю ошибка 400, неверный запрос ответ от HTTP.SYS (он даже не доходит до IIS). Я могу сказать, потому что эти запросы появляются в system32\LogFiles\HTTPERR
, например:
2009-09-17 19:51:29 200.123.179.9 3636 192.168.129.50 80 HTTP/1.1 GET /a_very_very_long_url_around_300_chars_long 400 - URL -
Я пробовал установить UrlSegmentMaxLength в реестре, и это устраняет проблему на моем компьютере с Windows 2003 x86, но не на производственном сервере x64. Я пробовал это на другом сервере Win2k3 x64, и это тоже не удалось.
Есть подсказки?
В конечном итоге я перешел на Windows 2008 R2 (IIS 7.5) x64 и применил изменение UrlSegmentMaxLength, и это сработало. Полагаю, это была ошибка в Windows 2003 x64 ...
Поскольку вы видите ошибки в журнале HTTPERR, это не проблема URLScan - HTTP.sys не передал URL-адрес в IIS, поэтому фильтр URLScan ISAPI не будет работать.
Из другая статья Windows IT ProHTTP.sys взял на себя функцию URLScan для решения большинства проблем, касающихся URL-адресов и длин сегментов, и вы правильно изучили разделы реестра HTTP.sys.
Что интересно, я могу это изменить, но у меня возникают проблемы с созданием таких длинных физических или виртуальных каталогов из-за проблем с MAX_PATH и ограничений метабазы.
Если вы используете инструмент перезаписи, на самом деле у вас могут быть проблемы, которые проявляются только в имплементации x64, или небольшая разница между тем, как x86 и x64 интерпретируют URL.
Сначала убедитесь, что вы используете последнюю версию URLscan (найдено Вот)
Затем убедитесь, что следующие записи есть в urlscan.ini, если вам нужно увеличить их (до более 300 для MaxUrl), это место для этого:
; Есть 3 особых случая ограничения:
;
; - MaxAllowedContentLength указывает максимально допустимый
; числовое значение заголовка запроса Content-Length. Для
; например, установка этого значения на 1000 вызовет любой запрос
; с длиной содержимого, превышающей 1000, будет отклонено.
; По умолчанию 30000000.
;
; - MaxUrl указывает максимальную длину URL-адреса запроса,
; не включая строку запроса. По умолчанию 260 (что
; эквивалентен MAX_PATH).
;
; - MaxQueryString указывает максимальную длину запроса
; строка. По умолчанию 2048
MaxAllowedContentLength = 30000000
MaxUrl = 260
MaxQueryString = 2048