当前位置:首页 > 百科

asp获取当前页面的url地址和参数

用ASP取当前页面的取当前页URL,最直接的址和办法是拼装Request.ServerVariables里的几个变量。很多人一上来就找Request.Url,参数但经典ASP里根本没这个属性,取当前页那是址和ASP.NET的东西。经典ASP时代,参数你只能靠ServerVariables集合来拼。取当前页

先看一个最常用的址和写法:

<% Dim currentUrl currentUrl = "http://" & Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("URL") If Request.ServerVariables("QUERY_STRING") <> "" Then currentUrl = currentUrl & "?" & Request.ServerVariables("QUERY_STRING") End If Response.Write currentUrl %>

这段代码干了三件事:拿域名(含端口)、拿路径、参数拿查询字符串。取当前页注意HTTP_HOST已经包含了端口号,址和比如localhost:8080,参数所以不用再单独取SERVER_PORT。取当前页但如果你用了非标准端口且想显式区分http和https,址和就得判断HTTPS变量是参数否为"on"。

有个坑我踩过:Request.ServerVariables("URL")返回的是虚拟路径,比如/blog/article.asp,它不会带域名。而Request.ServerVariables("SCRIPT_NAME")跟它几乎一样,区别在于某些ISAPI重写环境下URL可能被改写,SCRIPT_NAME保持原始脚本路径。我一般用URL,够用。

参数部分,QUERY_STRING拿到的是?后面那一整串,比如id=123&name=test。如果你想单独取某个参数值,用Request.QueryString("id")就行。但注意,如果参数名重复,比如?tag=a&tag=b,Request.QueryString("tag")返回的是逗号分隔的字符串a, b,不是数组。想要数组得用Request.QueryString("tag").Count配合索引,这个细节很多老代码里都写错了。

还有一种情况:表单提交后URL里没有参数,但你想拿到完整的原始URL。有人用Request.ServerVariables("HTTP_REFERER"),那是上一页地址,不是当前页。别搞混。当前页就是当前页,浏览器地址栏里是什么,你就该拼什么。

我见过一个实际项目,分页链接需要保留当前所有筛选条件。代码是这么写的:

<% Dim baseUrl, qs baseUrl = "http://" & Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("URL") qs = Request.ServerVariables("QUERY_STRING") ' 去掉page参数再拼回去 Dim newQs, params, i params = Split(qs, "&") newQs = "" For i = 0 To UBound(params) If Left(params(i), 5) <> "page=" Then If newQs <> "" Then newQs = newQs & "&" newQs = newQs & params(i) End If Next If newQs <> "" Then newQs = "?" & newQs Response.Write baseUrl & newQs & "&page=2" %>

这段代码逻辑没问题,但有个隐患:如果原始URL里参数顺序是page=1&id=5,去掉page后变成id=5,再拼&page=2,结果是?id=5&page=2,没问题。但如果原始URL是?id=5&page=1,去掉page后是id=5,拼出来还是?id=5&page=2,也正确。唯一要注意的是空参数情况,比如?id=5&,分割后最后一个元素是空字符串,拼回去会多一个&,得加个判断跳过空值。

另外,Request.ServerVariables("QUERY_STRING")返回的是原始编码,不会自动解码。如果你URL里有中文参数,比如?name=张三,浏览器会编码成%E5%BC%A0%E4%B8%89,QUERY_STRING拿到的就是编码后的。想显示中文得用Server.URLDecode或者Request.QueryString("name"),后者会自动解码。拼完整URL时如果直接拼QUERY_STRING,得到的是编码后的地址,这反而是对的——因为浏览器地址栏里本来就该是编码后的。

最后提一句:Request.ServerVariables("URL")在IIS里对大小写不敏感,但返回的路径大小写跟你实际文件名一致。Windows服务器不区分大小写,Linux下跑ASP(比如通过Chilisoft)就敏感了。我吃过这个亏,部署到Linux环境后链接全404,查了半天才发现是大小写问题。所以拼URL时别手动改大小写,直接拿ServerVariables的值最保险。

分享到: