我在 Windows 2003 x64 上托管的网站上有一个很长的 URL,如下所示:
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 服务器上尝试过这个,也失败了。
有什么提示吗?
答案1
由于您在 HTTPERR 日志中看到错误,所以这不是 URLScan 问题 - HTTP.sys 尚未将 URL 传递给 IIS,因此 URLScan ISAPI 过滤器将不会运行。
从不同的 Windows IT Pro 文章,HTTP.sys 已经取代 URLScan 解决了大多数与 URL 和段长度有关的问题,并且您检查 HTTP.sys 注册表项是正确的。
有趣的是,我可以改变这一点,但由于 MAX_PATH 问题和 Metabase 限制,创建这么长的物理目录或虚拟目录时会遇到问题。
如果您正在使用重写工具,那么您实际上可能会遇到仅在 x64 实现中才会出现的问题,或者 x86 和 x64 解释 URL 的方式之间存在细微的差异。
答案2
最终我迁移到了 Windows 2008 R2 (IIS 7.5) x64 并应用了 UrlSegmentMaxLength 更改,并且成功了。所以我猜这是 Windows 2003 x64 中的一个错误...
答案3
首先确保您使用的是最新版本的 URLscan(发现这里)
然后确保 urlscan.ini 中有以下条目,如果您需要增加它们(MaxUrl 超过 300),请在此处进行操作:
; 有 3 个特殊情况限制:
;
; - MaxAllowedContentLength 指定
Content-Length 请求标头允许的最大数值。例如
,将其设置为 1000 将导致任何
内容长度超过 1000 的请求被拒绝。
; 默认值为 30000000。
;
; - MaxUrl 指定请求 URL 的最大长度
,不包括查询字符串。默认值为 260(
相当于 MAX_PATH)。
;
; - MaxQueryString 指定查询
字符串的最大长度。默认值为 2048
MaxAllowedContentLength=30000000
MaxUrl=260
MaxQueryString=2048