做埋点的时候要把当前页面地址上报,前端同事问我要 URL,我说不就是 location.href 吗,他说那 hash 后面那段呢。才发现这里面细节挺多。

浏览器里怎么拿

  • 完整地址:location.href,包含协议、域名、路径、查询串和 hash。
  • 只取参数:location.search,从问号开始的那一段。
  • 锚点:location.hash,井号后面的内容,单页应用的路由常放在这里。
  • 域名和路径:location.hostname、location.pathname 各取所需。

解析查询参数别自己切字符串

用 URLSearchParams 更省心。new URLSearchParams(location.search).get(参数名) 直接拿到值,还会自动帮你处理编码。老代码里一堆 split 加 decodeURIComponent 拼出来的,遇到参数里带等号就翻车。

服务端怎么拿

Java 里用 request.getRequestURL() 拿带域名的地址,request.getQueryString() 拿参数串。PHP 里从 $_SERVER 里拼,注意 HTTP_HOST 来自请求头,不可信,别直接拿去拼接跳转地址,容易被钓鱼利用。Node 里 req.url 只有路径部分,要全地址得拼上协议和 Host 头。

一个常踩的坑

URL 里的中文和特殊字符会做百分号编码,取出来要先解码才是人看的内容。反过来拼接参数时要用 encodeURIComponent,别把整个带参数的 URL 扔进去,否则问号和等号都会被编码,服务端就解析不出来了。

纯前端拿 URL 很简单,但要拿得准、拿得安全,关键就在参数解析和编码这两步。封装一个取参工具函数,比到处手写字符串切割可靠得多。