ASP(Active Server Pages)拿当前页面的取当前网URL,核心就三个对象:Request.ServerVariables、取当前网Request.Url(其实ASP没有这个,取当前网那是取当前网ASP.NET的),别搞混。取当前网老ASP程序员都知道,取当前网真正干活的取当前网是Request.ServerVariables("HTTP_HOST")和Request.ServerVariables("SCRIPT_NAME"),再拼上QUERY_STRING。取当前网
我见过太多新手直接写Request.ServerVariables("URL"),取当前网拿到的取当前网只是虚拟路径,比如/news/detail.asp,取当前网没有域名。取当前网这要是取当前网在本地调试还好,一上线做跳转或者生成绝对链接,取当前网立马露馅——用户从百度点进来,取当前网你给他拼个localhost的地址,那画面太美我不敢看。
正确姿势是这样:
strHost = Request.ServerVariables("HTTP_HOST")
strPath = Request.ServerVariables("SCRIPT_NAME")
strQuery = Request.ServerVariables("QUERY_STRING")
然后拼起来:http://" & strHost & strPath & "?" & strQuery
这里有个坑。QUERY_STRING要是空的,你末尾还带个问号,强迫症看了难受。得判断一下,空就不加。还有HTTP_HOST可能带端口号,比如localhost:8080,这没问题,直接拼。SCRIPT_NAME是虚拟路径,不是物理路径,别用SERVER_PORT去拼端口,那玩意儿是字符串,遇到代理服务器会出错。
为什么要拿完整URL?我举个真实例子。之前做个老系统,用户登录后要跳回原页面。直接写Response.Redirect(Request.ServerVariables("HTTP_REFERER"))?不行,那个经常被浏览器禁用或者伪造。安全做法是登录前把当前URL存Session,登录完再取出来跳。但你存的时候不存全,只存相对路径/user/edit.asp?id=5,万一系统部署在虚拟目录下(比如http://site.com/myapp/),跳转就404了。必须存完整URL,包括协议和域名。
还有HTTPS的问题。你网站开了SSL,但代码里写死http://,用户从https页面提交表单,浏览器会警告混合内容。所以判断一下:Request.ServerVariables("HTTPS")如果等于"on"或者"1",就用https://开头。别嫌麻烦,这细节能救你一次。
另外有个冷门技巧:Request.ServerVariables("HTTP_X_FORWARDED_HOST"),这是反向代理时用的。如果你服务器前面挂了nginx或者IIS ARR,客户端请求的原始域名在那个变量里,HTTP_HOST可能是内网地址。我踩过这坑,折腾半天,日志里全是内网IP,后来才发现是代理没透传Host头。
最后说个土办法,适合临时调试用:
Response.Write(Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("URL") & "?" & Request.ServerVariables("QUERY_STRING"))
直接打印到页面上看。但生产环境别这么干,把服务器信息暴露给用户,等于告诉黑客你用什么技术栈,不划算。
总归一句话:拿URL不是拿一个变量,是拼出来的。协议、主机、路径、查询串,缺一不可。写的时候多想想用户实际访问场景,别在本地跑通就以为万事大吉。