哪些HTTP头会被增加HTTP_前缀

出自:http://www.lxway.com/989489916.htm

上一篇博客:ASP.net 获得客户端的IP相关知识 中我提到了,如果你想编码更改 HTTP_VIA、HTTP_X_FORWARDED_FOR 的值,你需要客户端增加的HTTP Head为:VIA、X_FORWARDED_FOR。即,少个 "HTTP_" 前缀。那么,到底读取这些值时,那些HTTP头增加时候需要增加HTTP_前缀,那些又不需要呢?

        简单来说,出了一些系统预先定义的,有特殊意义的HTTP头外,其他都需要增加 "HTTP_" 前缀。这是W3C 的 The Common Gateway Interface (CGI) 规范的定义。这些预定义的变量如下:

变量说明
APPL_MD_PATH检索 ISAPI DLL 的 (WAM) Application 的元数据库路径。
APPL_PHYSICAL_PATH检索与元数据库路径相应的物理路径。IIS 通过将 APPL_MD_PATH 转换为物理(目录)路径以返回值。
AUTH_PASSWORD该值输入到客户端的鉴定对话中。只有使用基本鉴定时,该变量才可用。
AUTH_TYPE这是用户访问受保护的脚本时,服务器用于检验用户的验证方法。
AUTH_USER未被鉴定的用户名。
CERT_COOKIE客户端验证的唯一 ID,以字符串方式返回。可作为整个客户端验证的签字。
CERT_FLAGS

如有客户端验证,则 bit0 为 1。
如果客户端验证的验证人无效(不在服务器承认的 CA 列表中),bit1 被设置为 1。

CERT_ISSUER

用户验证中的颁布者字段(O=MS,OU=IAS,CN=user name,C=USA)。

CERT_KEYSIZE

安全套接字层连接关键字的位数,如 128。

CERT_SECRETKEYSIZE

服务器验证私人关键字的位数。如 1024。

CERT_SERIALNUMBER

用户验证的序列号字段。

CERT_SERVER_ISSUER服务器验证的颁发者字段。
CERT_SERVER_SUBJECT服务器验证的主字段。
CERT_SUBJECT客户端验证的主字段。
CONTENT_LENGTH客户端发出内容的长度。
CONTENT_TYPE内容的数据类型。同附加信息的查询一起使用,如 HTTP 查询 GET、 POST 和 PUT。
GATEWAY_INTERFACE服务器使用的 CGI 规格的修订。格式为 CGI/revision。
HTTPS如果请求穿过安全通道(SSL),则返回 ON。如果请求来自非安全通道,则返回 OFF。
HTTPS_KEYSIZE安全套接字层连接关键字的位数,如 128。
HTTPS_SECRETKEYSIZE服务器验证私人关键字的位数。如 1024。
HTTPS_SERVER_ISSUER服务器验证的颁发者字段。
HTTPS_SERVER_SUBJECT服务器验证的主字段。
INSTANCE_ID文本格式 IIS 实例的 ID。如果实例 ID 为 1,则以字符形式出现。使用该变量可以检索请求所属的(元数据库中)Web 服务器实例的 ID。
INSTANCE_META_PATH响应请求的 IIS 实例的元数据库路径。
LOCAL_ADDR返回接受请求的服务器地址。如果在绑定多个 IP 地址的多宿主机器上查找请求所使用的地址时,这条变量非常重要。
LOGON_USER

用户登录 Windows NT® 的帐号。

PATH_INFO客户端提供的额外路径信息。可以使用这些虚拟路径和 PATH_INFO 服务器变量访问脚本。如果该信息来自 URL,在到达 CGI 脚本前就已经由服务器解码了。
PATH_TRANSLATEDPATH_INFO 转换后的版本,该变量获取路径并进行必要的由虚拟至物理的映射。
QUERY_STRING查询 HTTP 请求中问号(?)后的信息。 
REMOTE_ADDR发出请求的远程主机的 IP 地址。 
REMOTE_HOST发出请求的主机名称。如果服务器无此信息,它将设置为空的 MOTE_ADDR 变量。
REMOTE_USER用户发送的未映射的用户名字符串。该名称是用户实际发送的名称,与服务器上验证过滤器修改过后的名称相对。
REQUEST_METHOD该方法用于提出请求。相当于用于 HTTP 的 GET、HEAD、POST 等等。
SCRIPT_NAME执行脚本的虚拟路径。用于自引用的 URL。
SERVER_NAME出现在自引用 UAL 中的服务器主机名、DNS 化名或 IP 地址。
SERVER_PORT发送请求的端口号。
SERVER_PORT_SECURE包含 0 或 1 的字符串。如果安全端口处理了请求,则为 1,否则为 0。
SERVER_PROTOCOL请求信息协议的名称和修订。格式为 protocol/revision 。
SERVER_SOFTWARE应答请求并运行网关的服务器软件的名称和版本。格式为 name/version 。
URL

提供 URL 的基本部分。

其他几个跟HTTP_前缀有关的变量
ALL_HTTP客户端发送的所有带 HTTP_ 前缀的变量。
ALL_RAW客户端发送的所有HTTP标头,其结果和客户端发送时一样,没有前缀HTTP_ 。
HTTP_

HeaderName 存储在标题文件中的值。未列入该表的标题文件必须以 HTTP_ 作为前缀,以使 ServerVariables 集合检索其值。
注意 服务器将 HeaderName 中的下划线(_)解释为实际标题中的破折号。例如,如果您指定 HTTP_MY_HEADER,服务器将搜索以 MY-HEADER 为名发送的标题文件。

我们通过.net 的开源代码也可以看到上面的逻辑,这部分的核心代码在 System.Web.HttpRequest 类的 FillInServerVariablesCollection 方法

        internal void FillInServerVariablesCollection() {
            if (_wr == null)
                return

            //  Add from hardcoded list

            AddServerVariableToCollection("ALL_HTTP",           CombineAllHeaders(false));
            AddServerVariableToCollection("ALL_RAW",            CombineAllHeaders(true)); 

            AddServerVariableToCollection("APPL_MD_PATH");

            AddServerVariableToCollection("APPL_PHYSICAL_PATH", _wr.GetAppPathTranslated()); 

            AddServerVariableToCollection("AUTH_TYPE",          DynamicServerVariable.AUTH_TYPE); 
            AddServerVariableToCollection("AUTH_USER",          DynamicServerVariable.AUTH_USER); 

            AddServerVariableToCollection("AUTH_PASSWORD"); 

            AddServerVariableToCollection("LOGON_USER");
            AddServerVariableToCollection("REMOTE_USER",        DynamicServerVariable.AUTH_USER);

            AddServerVariableToCollection("CERT_COOKIE");
            AddServerVariableToCollection("CERT_FLAGS"); 
            AddServerVariableToCollection("CERT_ISSUER"); 
            AddServerVariableToCollection("CERT_KEYSIZE");
            AddServerVariableToCollection("CERT_SECRETKEYSIZE"); 
            AddServerVariableToCollection("CERT_SERIALNUMBER");
            AddServerVariableToCollection("CERT_SERVER_ISSUER");
            AddServerVariableToCollection("CERT_SERVER_SUBJECT");
            AddServerVariableToCollection("CERT_SUBJECT"); 

            String clString = _wr.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength); 
            AddServerVariableToCollection("CONTENT_LENGTH",     (clString != null) ? clString : "0"); 

            AddServerVariableToCollection("CONTENT_TYPE",       this.ContentType); 

            AddServerVariableToCollection("GATEWAY_INTERFACE");

            AddServerVariableToCollection("HTTPS"); 
            AddServerVariableToCollection("HTTPS_KEYSIZE");
            AddServerVariableToCollection("HTTPS_SECRETKEYSIZE"); 
            AddServerVariableToCollection("HTTPS_SERVER_ISSUER"); 
            AddServerVariableToCollection("HTTPS_SERVER_SUBJECT");

            AddServerVariableToCollection("INSTANCE_ID");
            AddServerVariableToCollection("INSTANCE_META_PATH");

            AddServerVariableToCollection("LOCAL_ADDR",         _wr.GetLocalAddress()); 

            AddServerVariableToCollection("PATH_INFO",          DynamicServerVariable.PATH_INFO); 
            AddServerVariableToCollection("PATH_TRANSLATED",    DynamicServerVariable.PATH_TRANSLATED); 

            AddServerVariableToCollection("QUERY_STRING",       DynamicServerVariable.QUERY_STRING); 

            AddServerVariableToCollection("REMOTE_ADDR",        this.UserHostAddress);
            AddServerVariableToCollection("REMOTE_HOST",        this.UserHostName);

            AddServerVariableToCollection("REMOTE_PORT");

            AddServerVariableToCollection("REQUEST_METHOD",     this.HttpMethod); 

            AddServerVariableToCollection("SCRIPT_NAME",        DynamicServerVariable.SCRIPT_NAME); 

            AddServerVariableToCollection("SERVER_NAME",        _wr.GetServerName());
            AddServerVariableToCollection("SERVER_PORT",        _wr.GetLocalPortAsString());

            AddServerVariableToCollection("SERVER_PORT_SECURE", _wr.IsSecure() ? "1" : "0");

            AddServerVariableToCollection("SERVER_PROTOCOL",    _wr.GetHttpVersion()); 
            AddServerVariableToCollection("SERVER_SOFTWARE");

            AddServerVariableToCollection("URL",                DynamicServerVariable.SCRIPT_NAME);

            // Add all headers in HTTP_XXX format

            for (int i = 0; i < HttpWorkerRequest.RequestHeaderMaximum; i++) {
                String h = _wr.GetKnownRequestHeader(i); 
                if (!String.IsNullOrEmpty(h)) 
                    AddServerVariableToCollection(HttpWorkerRequest.GetServerVariableNameFromKnownRequestHeaderIndex(i), h);
            } 

            String[][] hh = _wr.GetUnknownRequestHeaders();

            if (hh != null) { 
                for (int i = 0; i < hh.Length; i++)
                    AddServerVariableToCollection(ServerVariableNameFromHeader(hh[i][0]), hh[i][1]); 
            } 
        }

小结:

       通过上面的代码和说明可以看到:

       在客户端发送的HTTP Head 信息中, 是原模原样发送的,并没有增加 HTTP_ 前缀。 服务器段接受到时,也是原模原样的。
       按照 W3C 的规范, 除了上述头信息外,其他都需要在服务器端访问时候增加HTTP_ 前缀。 ASP.net 中更极端,除了正常的值获得外。所有值又额外多加了一遍 HTTP_ 前缀。

 

另外,对于客户段来说,并不是所有 HTTP 头都是可以设置的,下面的是受限制的标头。它们或者直接由 API(如 Content-Type)公开,或者受到系统保护,不能被更改:

Accept 
Connection 
Content-Length 
Content-Type 
Date 
Expect 
Host 
If-Modified-Since 
Range 
Referer 
Transfer-Encoding 
User-Agent 
Proxy-Connection



以下出处:http://www.soaspx.com/dotnet/asp.net/tech/tech_20101124_6640.html

本机ip:<%=request.servervariables("remote_addr")%>
服务器名:<%=Request.ServerVariables("SERVER_NAME")%>
服务器IP:<%=Request.ServerVariables("LOCAL_ADDR")%>
服务器端口:<%=Request.ServerVariables("SERVER_PORT")%>
服务器时间:<%=now%>
IIS版本:<%=Request.ServerVariables("SERVER_SOFTWARE")%>
脚本超时时间:<%=Server.ScriptTimeout%>
本文件路径:<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%>
服务器CPU数量:<%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%>
服务器解译引擎:<%=ScriptEngine & "/"& ScriptEngineMajorVersion&"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %>
服务器操作系统:<%=Request.ServerVariables("OS")%>
支持的文件类型:<%=Request.ServerVariables("HTTP_Accept")%>
访问的文件路径:<%=Request.ServerVariables("HTTP_url")%>
用户代理的信息:<%=Request.ServerVariables("HTTP_USER_AGENT")%>

 
 
Request.ServerVariables变量意义.  http代理相关知识
Request.ServerVariables["HTTP_VIA"]---------可以获得用户内部的ip
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]---------可以知道代理服务器的服务器名以及端口
Request.ServerVariables["REMOTE_ADDR"]--发出请求的远程主机的IP地址。

 

http代理相关知识
关键就在HTTP_X_FORWARDED_FOR
使用不同种类代理服务器,上面的信息会有所不同:

一、没有使用代理服务器的情况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies
REMOTE_ADDR = 代理服务器 IP 
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies
REMOTE_ADDR = 代理服务器 IP 
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies
REMOTE_ADDR = 代理服务器 IP 
HTTP_VIA = 代理服务器 IP 
HTTP_X_FORWARDED_FOR = 随机的 IP
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 


Request.ServerVariables("Url") 
返回服务器地址

 

Request.ServerVariables("Path_Info") 
客户端提供的路径信息

Request.ServerVariables("Appl_Physical_Path") 
与应用程序元数据库路径相应的物理路径

Request.ServerVariables("Path_Translated") 
通过由虚拟至物理的映射后得到的路径

Request.ServerVariables("Script_Name") 
执行脚本的名称

Request.ServerVariables("Query_String") 
查询字符串內容

Request.ServerVariables("Http_Referer") 
请求的字符串內容

Request.ServerVariables("Server_Port") 
接受请求的服务器端口号

Request.ServerVariables("Remote_Addr") 
发出请求的远程主机的IP地址

Request.ServerVariables("Remote_Host") 
发出请求的远程主机名称

Request.ServerVariables("Local_Addr") 
返回接受请求的服务器地址

Request.ServerVariables("Http_Host") 
返回服务器地址

Request.ServerVariables("Server_Name") 
服务器的主机名、DNS地址或IP地址

Request.ServerVariables("Request_Method") 
提出请求的方法比如GET、HEAD、POST等等

Request.ServerVariables("Server_Port_Secure")
如果接受请求的服务器端口为安全端口时,则为1,否则为0

Request.ServerVariables("Server_Protocol")
服务器使用的协议的名称和版本

Request.ServerVariables("Server_Software")
应答请求并运行网关的服务器软件的名称和版本

Request.ServerVariables("All_Http")
客户端发送的所有HTTP标头,前缀HTTP_

Request.ServerVariables("All_Raw")
客户端发送的所有HTTP标头,其结果和客户端发送时一样,没有前缀HTTP_

Request.ServerVariables("Appl_MD_Path")
应用程序的元数据库路径

Request.ServerVariables("Content_Length")
客户端发出內容的长度

Request.ServerVariables("Https")
如果请求穿过安全通道(SSL),则返回ON如果请求来自非安全通道,则返回OFF

Request.ServerVariables("Instance_ID")
IIS实例的ID号

Request.ServerVariables("Instance_Meta_Path")
响应请求的IIS实例的元数据库路径

Request.ServerVariables("Http_Accept_Encoding")
返回內容如:gzip,deflate

Request.ServerVariables("Http_Accept_Language")
返回內容如:en-us

Request.ServerVariables("Http_Connection")
返回內容:Keep-Alive

Request.ServerVariables("Http_Cookie")
返回內容如:nVisiT%

2DYum=125;ASPSESSIONIDCARTQTRA=FDOBFFABJGOECBBKHKGPFIJI;ASPSESSIONIDCAQQTSRB=LKJJPLABABILLPCOGJGAMKAM;ASPSESSIONIDACRRSSRA=DK

HHHFBBJOJCCONPPHLKGHPB

Request.ServerVariables("Http_User_Agent")
返回內容:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)

Request.ServerVariables("Https_Keysize")
安全套接字层连接关键字的位数,如128

Request.ServerVariables("Https_Secretkeysize")
服务器验证私人关键字的位数如1024

Request.ServerVariables("Https_Server_Issuer")
服务器证书的发行者字段

Request.ServerVariables("Https_Server_Subject")
服务器证书的主题字段

Request.ServerVariables("Auth_Password")
当使用基本验证模式时,客户在密码对话框中输入的密码

Request.ServerVariables("Auth_Type")
是用户访问受保护的脚本时,服务器用於检验用户的验证方法

Request.ServerVariables("Auth_User")
代证的用户名

Request.ServerVariables("Cert_Cookie")
唯一的客户证书ID号

Request.ServerVariables("Cert_Flag")
客户证书标誌,如有客户端证书,则bit0为0如果客户端证书验证无效,bit1被设置为1

Request.ServerVariables("Cert_Issuer")
用户证书中的发行者字段

Request.ServerVariables("Cert_Keysize")
安全套接字层连接关键字的位数,如128

Request.ServerVariables("Cert_Secretkeysize")
服务器验证私人关键字的位数如1024

Request.ServerVariables("Cert_Serialnumber")
客户证书的序列号字段

Request.ServerVariables("Cert_Server_Issuer")
服务器证书的发行者字段

Request.ServerVariables("Cert_Server_Subject")
服务器证书的主题字段

Request.ServerVariables("Cert_Subject")
客户端证书的主题字段

Request.ServerVariables("Content_Type")
客户发送的form內容或HTTPPUT的数据类型

Request.ServerVariables("HTTP_X_FORWARDED_FOR") 
可以获得位于代理(网关)后面的直接IP,当然必须这个代理支



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
138文章管理系统,采用Asp+Access开发,适应中小新闻文章型网站及个人网站需求,整个网站采用Div+Css布局,IE6、IE7、IE8、Firefox、Chrome下测试无误。 如果放在根目录,不需要修改任何东西即可运行。 请确保你的空间支持FSO及AspJpeg组件,否则可能有些功能无法使用。 默认后台管理路径admin/admin_login.asp,用户名及密码都是admin 〓〓〓〓〓〓〓〓 功 能 说 明 〓〓〓〓〓〓〓〓 1.多风格功能,支持风格选择与在线编辑、后台风格及Rss批量生成、网站地图、站内站外综合搜索、简繁转换。 2.图片上传水印功能(需组件支持)、Logo上传、后台附件上传、无用上传文件清除。 3.文章采集、广告管理、自定义标签管理、留言本、友情链接、图片文章、正文分页、批量删除、二级栏目、栏目关键字、投票调查、图片文章、正文分页、底部说明、商品展示。 4.文章内容页伪静态、后台自行设置动态及伪静态和静态、首页及栏目页和文章页生成html。 5.Ajax无刷新评论功能、留言审核、评论审核、管理员回复评论、游客发表评论开关 6.搜索蜘蛛记录、google地图生成、google地图提交 7.网站背景设置、flash幻灯增加参数控制、支持flv文件播放、幻灯可外链图片。 8.外部调用JS,后台可自定义生成代码。 9.文章列表摘要控制、文章内容自动分页、文章页心情投票、文章列表每页显示条数设置、文章自定义关键字及描述、文章及栏目查看权限。 10.采集:按目标文章分页、保存图片时增加水印、自动分页字数、规则导入导出、自动提取文章中第一张图片为幻灯。 11.分页快速跳转到某页。 12.前台会员登录保存Cookies控制、后台多管理员及权限控制、前台会员上传图片控制。 13.站内关键字链接、根据词库自动获取标题关键字。 14.数据库表名前缀自定义。 15.后台多管理员及权限控制、前台会员上传图片控制。 16.QQ登录、QQ登陆绑定、QQ登录自动保存头像到本地、后台开关控制。 17.留言论坛模式(商业版)。 18.sina关注按钮并可后台设置。 19.文章页入QQ空间喜欢按钮,方便QQ用户推广文章,带来流量。 20.网站采集伪原创功能,后台可设置开启与关闭。 21.网站可设置整站、文章页、留言本IP限制访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值