ASP里取URL这事儿,说穿了就两行代码的事,但坑全藏在细节里。
先看最常用的写法:Request.ServerVariables("URL"),返回的是类似/news/detail.asp的路径。可你要是拿它做跳转,八成会栽跟头——它不带域名,也不带查询字符串。我当年做站内搜索分页,就吃过这亏,翻第二页的时候URL直接丢了参数,用户哐当一下掉回第一页。
要拿完整地址,得拼HTTP_HOST和QUERY_STRING。我习惯这么干:
Function GetFullUrl() Dim ssl, host, path, query ssl = "http" If Request.ServerVariables("HTTPS") = "on" Then ssl = "https" host = Request.ServerVariables("HTTP_HOST") path = Request.ServerVariables("URL") query = Request.ServerVariables("QUERY_STRING") GetFullUrl = ssl & "://" & host & path If query <> "" Then GetFullUrl = GetFullUrl & "?" & query End Function 这段代码有个细节值得琢磨:HTTPS判断不能只看端口号。以前有台测试机,SSL跑在8443端口上,我傻乎乎地判断SERVER_PORT=443,结果生产环境全乱套。后来改成检测HTTPS变量,干净利落。
还有个容易忽略的变量叫SCRIPT_NAME,它跟URL的区别在于,URL返回的是原始请求路径,而SCRIPT_NAME返回的是实际执行的脚本路径。如果做过URL重写,这俩值可能不一样。比如用户访问/product/123,实际执行的是/product.asp?id=123,这时候取SCRIPT_NAME才能拿到真实文件名。
有人爱用Request.ServerVariables("HTTP_REFERER")反查来源页,我劝你少碰。这东西跟浏览器脾气走,有的用户开了隐私模式,有的用代理,referer经常是空的。更离谱的是,某些安全软件会把referer改写成about:blank。你要是拿它做权限判断,纯属自己找不痛快。
最后说个冷门场景:IIS6时代,服务器支持PATH_INFO,能拿到URL里脚本名后面的部分。比如/news.asp/2024/01,PATH_INFO就是/2024/01。现在IIS7以后这玩意儿还能用,但用的人少了。我见过老项目拿它做伪静态,维护起来那叫一个酸爽——路径里多个斜杠就404,少个参数就白屏。
写代码这事,最怕的就是你以为拿到了整个URL,其实只拿到半个。取URL本质上是跟服务器要信息,关键是搞清楚自己要哪块——要路径?要参数?要完整地址?还是想确认协议?明确需求再动手,比背十个函数都管用。毕竟ASP这老家伙,活到今天全靠程序员对它脾气的精准拿捏。