![](/img/trans.png)
[英]$_SERVER['HTTP_REFERER'] vs Request.ServerVariables(“HTTP_REFERER”)
[英]Request.QueryString And Request.ServerVariables(“QUERY_STRING”) Not Displaying UNICODE
我正在向经典ASP应用程序添加日志记录功能,并且在用户提交UNICODE查询时难以正确显示Request.QueryString和Request.ServerVariables。
例如 -
Response.write Request.QueryString
strVar1=&strVar2=%E8%A1%8C%E9%9B%B2%E6%B5%81%E6%B0%B4&strVar3=blah1&strVar4=blah2
Response.write Request.ServerVariables("QUERY_STRING")
strVar1=&strVar2=%E8%A1%8C%E9%9B%B2%E6%B5%81%E6%B0%B4&strVar3=blah1&strVar4=blah2
然而,如果我在Request.QueryString中指定一个UNICODE变量,它会正确打印:
Response.write Request.QueryString("strVar2")
行雲流水
如何获取Request.QueryString或Request.ServerVariables(“QUERY_STRING”)以包含UNICODE? 我在搜索和结果页面上都有以下内容,并且查询对数据库成功执行:
<%
Response.CodePage = 65001
Response.CharSet = "utf-8"
%>
要回答bobince的问题,我正在尝试记录他们提交的搜索条件和页面 - 如果有更好的方法可以做到这一点,我会全力以赴:
'Enable Logging: writes to MyDB.dbo.logging
'---------------------------------------------------------------------------------------------
Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandType = adCmdText
cmd.ActiveConnection = objConn
strADName = UCase(Request.ServerVariables("AUTH_USER"))
Protocol = Request.ServerVariables("SERVER_PROTOCOL")
Protocol = Left(Protocol,InStr(Request.ServerVariables("SERVER_PROTOCOL"),"/")-1)
if Request.ServerVariables("SERVER_PORT") = "80" then
port = ""
else
port = ":" & Request.ServerVariables("SERVER_PORT")
end if
CurPageURL = lcase(Protocol) & "://" & Request.ServerVariables("SERVER_NAME") &_
port & Request.ServerVariables("SCRIPT_NAME") & "?" & _
Request.ServerVariables("QUERY_STRING")
strSQL = "INSERT INTO MyDB.dbo.Logging([user],URL) SELECT ?, ? "
cmd.Parameters.Append (cmd.CreateParameter("User", adVarWChar, adParamInput, len(strADName), strADName))
cmd.Parameters.Append (cmd.CreateParameter("URL", adVarWChar, adParamInput, len(CurPageURL), CurPageURL))
cmd.CommandText = strSQL
set objRS = cmd.Execute
'-----------------------------------------------------------------------------------------------
这与Unicode无关。
Request.QueryString
做了两件事。
如果您在没有参数的情况下使用它,它将完全按照浏览器提交的方式返回整个查询字符串(如上所述,与QUERY_STRING服务器变量相同)。
如果将它与"strVar2"
类的参数一起使用,它会将查询字符串拆分为参数部分,找到与参数名称对应的一个( strVar2=...
),然后返回该值。 在这样做时,它负责对查询字符串的组件进行URL解码,包括名称和值,因此输入中的%xx
序列被解码为它们所代表的字节序列:0xE8,0xA1,0x8C,依此类推。 当您将该字节字符串打印到浏览器解码为UTF-8的页面时,他们将看到行雲流水
。
如果您真的需要,可以在完整的查询字符串上自行执行URL解码步骤。 在Classic ASP中没有用于URL解码的内置功能,但您可以自己编写这样的功能(参见例如来自http://www.aspnut.com/reference/encoding.asp的 URLDecode
),或者使用
decodeURIComponent(s.replace(/\+/g, ' '))
来自JScript。
请注意,如果您将整个URL字符串进行URL解码,则可能会破坏它。 例如,输入查询字符串:
foo=abc%26def&bar=%e6%97%a5%e6%9c%ac%e8%aa%9e
你会得到:
foo=abc&def&bar=日本語
这对日本人来说很好,但是foo
值的&符号已经破坏了整个字符串,所以你不能再确定原始参数是什么了。 一般情况下,一旦将URL组件从它们所引入的URL中分离出来,通常只能解码它们。这就是ASP为你做的事情: Request.QueryString("foo")
会在这里正确地返回abc&def
这就是为什么你应该几乎总是在使用它检索参数的方法。
您通过解码整个查询字符串到底想要做什么?
如果这可以帮助别人:
我通过使用带有&作为分隔符的split函数从QUERY_STRING中提取变量名来解决此问题。 然后我使用Request.QueryString的变量来获取值,包括具有UNICODE的值。 这是有效的,除非用户在查询中包含&,这将是非常罕见的。 我确实陷阱,所以至少在这种情况下我仍然可以看到日志中访问的用户和页面。 Bobince你的反应很好,我会选择它作为答案。
'Enable Logging: writes to MyDB.dbo.logging
'---------------------------------------------------------------------------------------------
Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandType = adCmdText
cmd.ActiveConnection = objConn
cmd.CommandTimeOut = 1200
strADName = UCase(Request.ServerVariables("AUTH_USER"))
Protocol = Request.ServerVariables("SERVER_PROTOCOL")
Protocol = Left(Protocol,InStr(Request.ServerVariables("SERVER_PROTOCOL"),"/")-1)
if Request.ServerVariables("SERVER_PORT") = "80" then
port = ""
else
port = ":" & Request.ServerVariables("SERVER_PORT")
end if
CurPageURL = lcase(Protocol) & "://" & Request.ServerVariables("SERVER_NAME") &_
port & Request.ServerVariables("SCRIPT_NAME") & "?"
On Error Resume Next
a = Request.ServerVariables("QUERY_STRING")
a = split(a,"&")
for each x in a
'response.write(left(x,InStr(x,"=")-1) & "<br />")
CurPageURL = CurPageURL + left(x,InStr(x,"=")-1) + "=" + Request.QueryString(left(x,InStr(x,"=")-1)) & "&"
next
If Err.Number <> 0 Then
CurPageURL = CurPageURL + "Error: Search Term Contained a &"
Err.Clear
Else
CurPageURL = left(CurPageURL,len(CurPageURL)-1)
End If
strSQL = "INSERT INTO MyDB.dbo.Logging([user],URL) SELECT ?, ? "
cmd.Parameters.Append (cmd.CreateParameter("User", adVarWChar, adParamInput, len(strADName), strADName))
cmd.Parameters.Append (cmd.CreateParameter("URL", adVarWChar, adParamInput, len(CurPageURL), CurPageURL))
cmd.CommandText = strSQL
set objRS = cmd.Execute
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.