通常,HTTP Proxy会更改或者添加以下的HTTP请求变量:
REMOTE_ADDR
HTTP_VIA
HTTP_X_FORWARDED_FOR
当没有使用HTTP Proxy的时候,这几个变量的值应该如下:
REMOTE_ADDR: HTTP Client(浏览器)所在机器的IP
HTTP_VIA: 无定义,也就是说不会在HTTP请求中出现
HTTP_X_FORWARDED_FOR: 无定义,
同上 当你使用了普通配置的HTTP Proxy的时候,这几个变量就变成下面的样子了:
REMOTE_ADDR: HTTP Proxy's IP (不变的话就容易判断了,呵呵)
HTTP_VIA: HTTP Proxy's IP or HTTP Proxy' ServerName或HTTP协议版本号或HTTP Proxy版本信息(有什么办法呢,这可没有RFC定义的说,不同的厂商做出来的HTTP Proxy这个字段的东东是不一样的说)
HTTP_X_FORWARDED_FOR: HTTP Client(浏览器)所在机器的IP (Squid使用,ISA不支持此字段) 其实分析到这里,偶们的目的已经可以实现了。只要发现某个HTTP请求头部带有HTTP_VIA或HTTP_X_FORWARDED_FOR,那么这个发起HTTP请求的IP必定是个HTTP Proxy。
所以呢:可以这样做,在httpmodule或global中过滤:
if((HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] !=String.Empty) )
httpContext.Current.Response.End();
ps:这个是一般的做法,不过呢如果代理服务器没有修改http 请求变量,那个我们就真的没有办法了,不过这种情况相当的少了,这样就行了~~