IIS 是否内置有秘密、未记录、透明、区分大小写的代理?
网络服务器上存在一个文件:
GET http://www.stackoverflow.com/javascript/ModifyQuoteArea.js HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: www.stackoverflow.com
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 29246
Date: Mon, 07 Mar 2011 14:20:07 GMT
Content-Type: application/x-javascript
ETag: "5a0a6178edacb1:1c51"
Server: Microsoft-IIS/6.0
Last-Modified: Fri, 02 Tue 2010 17:03:32 GMT
Accept-Ranges: bytes
X-Powered-By: ASP.NET
...
问题是,对文件所做的更改将不会得到处理,老的(即去年二月)版本不断被提供:
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 29246
Date: Mon, 07 Mar 2011 14:23:07 GMT
Content-Type: application/x-javascript
ETag: "5a0a6178edacb1:1c51"
Server: Microsoft-IIS/6.0
Last-Modified: Fri, 02 Tue 2010 17:03:32 GMT
Accept-Ranges: bytes
X-Powered-By: ASP.NET
...
即使我们已经:
- 重命名文件
- 删除了文件
- 重新启动 IIS
对此文件的请求未出现在 IIS 日志中(例如C:\WINNT\System32\LogFiles\W3SVC7\
)
并且这只会从外部(即互联网)发生。如果您在服务器本地发出请求,那么您将:
- 获取当前文件(那里的文件)
- 404(文件已重命名)
- 404(文件已删除)
但如果我改变案件所请求的资源,即:
GET http://www.stackoverflow.com/javascript/MoDiFyQuOtEArEa.js HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: www.stackoverflow.com
注:
MoDiFyQuOtEArEa.js
诗句ModifyQuoteArea.js
然后我做获取正确的文件(或者如果文件被重命名或删除,则会像我预期的那样获取 404)。
但是,在我更改我所要求的文件的大小写之前,对文件的任何后续更改都不会显示出来。
当网站提供其中一个神秘的缓存文件时,IIS 日志显示没有活动。对其他(即 ASP)文件的请求(或使用更改请求的资源情况以绕过透明缓存技巧)确实会出现在 IIS 日志中,并且会显示正确的源客户端 IP 地址(即,而不是某些神秘的中间代理的地址)。
- 由于该文件不再存在于硬盘上,因此我得出结论,存在代理。
- 该代理提供的服务请求不会记录在 IIS 日志中。
- 记录了对新文件的请求,并且来自客户端 IP,而不是代理 IP。
- 代理区分大小写。
这才不是听起来像是微软或 IIS 会做的事情: - 透明代理? - 区分大小写? - 未记录? - 重启 IIS 后依然存在? - 在缓存中存活数小时?
不敢相信我们客户的 IIS 正在做这些事情。我假设 IIS 前面还有其他透明代理。
或者,IIS 是否有:
- 透明的,
- 未记录,
- 区分大小写,
- 基于记忆
代理,缓存内容至少 7 个小时?
答案1
如果请求未出现在 IIS 日志中,则表明该请求由某个地方的缓存提供服务,该缓存要么是客户端的本地缓存,要么是请求链中某个地方的缓存(代理)。
查看客户端请求的响应标头,看看Via:
其中是否有任何标头。Via:
标头表示链中有一个代理,并且链中的每个代理都应该有一个标头(假设代理运行正常)。如果您看到一个或多个标头,则很有可能内容是从缓存中提供的。
答案2
在我戴上锡纸帽并宣称一定有一个无人知晓的超级秘密代理之前,我会要求客户检查他们的浏览器设置。如果他们使用的是 IE,这听起来有点像“检查存储页面的较新版本:从不”(如果客户在故障排除过程中没有重新启动 IE,也可以是“每次启动 IE 时”)。
答案3
尝试 curl -vhttp://www.stackoverflow.com/javascript/ModifyQuoteArea.js,如果您仍然看到旧版本,则说明从客户端到服务器的路径中存在错误配置/不符合 HTTP 标准的缓存。如果您看到当前版本,则您的浏览器将受到指责
答案4
所以答案是“不应该”。
以问题的形式给出较长的回答:你在那里展示的代理行为是非常类似代理,因为主机名是请求的一部分。您是否将服务器视为代理,还是仅捕获来自代理的流量?
通常,当客户端请求内容时,他们会请求一个相对 URL 并提供一个 Host: 标头。
客户端向代理服务器请求http://fullsomethingname.fqdn.com 仅当目标配置为代理时,之前我不得不基于此来调试奇怪的行为。
因此,我们可以肯定地说,您在混合中某处有一个代理。Fiddler 充当代理,算数。
我建议像 Ochoto 一样尝试使用 Curl、WFETCH、WGET 或任何其他简单的不受 WinInet 或 IE 浏览器设置或代理缓存干扰的客户端绝对地肯定。
实际上,如果你想要绝对确定:
- 在客户端上运行的网络捕获
- 在服务器上同时进行网络捕获
- 使用浏览器客户端请求所述内容
- 使用非浏览器客户端请求相同内容
- 如果你有 IIS 7,那么 URL 的 FREB 日志记录将非常棒
- 理想情况下,能够在 Web 服务器处理每个扩展时逐步执行该操作;否则,可以使用 IISTrace 之类的工具
如果您真的愿意,您也可以加入 HTTP.SYS 跟踪,以确保万无一失。
如果
- 你看到请求到达了服务器,并且
- 服务器发送响应,并且
- 该响应绝对未被服务器记录,并且
- 不存在 ISAPI 筛选器,因此无法确定日志记录所以1999 年,或
- 只是窒息
- 没有受到杀毒软件的骚扰该文件句柄是有效的,不,它不是,你明白,毕竟它是方式,以及
- 托管处理程序中没有发生任何异常,这些异常不应该针对静态文件运行,但由于某种原因,仍然通过脚本映射到处理这些文件
然后,然后,然后 然后,嗯,哦,抱歉,我思路中断了。