【问题标题】:location.href return strange URLlocation.href 返回奇怪的 URL
【发布时间】:2017-03-19 17:40:04
【问题描述】:

我正在使用location.href 来获取浏览器地址栏中存在的完整 URL。
为了提供更多详细信息,请务必注意我们的服务有一个 js 文件,该文件将包含在我们的客户站点中。所以这个 JS 文件会生成申请人的完整 URL。

我认为这个 URL 不知何故是以前重定向到真实域的 URL,但我应该如何防止这种行为呢?

将为 iframe 的 src 属性生成链接的 JS 代码行是:

'http://sd.domain.ir/index.php?r=' + Math.floor(Math.random() * (100000000 - 0 + 1)) + 0 + '&ref=' + ((window.btoa) ? btoa(location.href) : 'ie') + '&responsive=' + ((document.querySelector('meta[name="viewport"][content*="width=device-width"]')) ? 'yes' : 'no') + '&params='

申请人UA示例:
Mozilla\/5.0 (Linux; U; Android 4.3; en-us; HUAWEI G620-L72 Build\/HuaweiG620-L72) AppleWebKit\/534.24 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.24 T5\/2.0 bdbrowser\/6.1.0.4

Mozilla\/5.0 (Linux; U; Android 4.4.3; en-ae; HTC_One Build\/KTU84L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30

Mozilla\/5.0 (Linux; U; Android 4.3; en-us; GT-I9300 Build\/JSS15J) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30

...

location.href 有时会生成奇怪的 url,我不知道是什么原因。例如:

主 URL 如下所示: http://saten.ir/tag/%D8%A8%DB%8C%D9%88%DA%AF%D8%B1%D8%A7%D9%81%DB%8C-%D8%A7%D9%85%DB%8C%D8%B1%D8%B9%D8%A8%D8%A7%D8%B3-%D9%81%D8%AE%D8%B1%D8%A2%D9%88%D8%B1/

但是location.href返回的网址如下:
http://www.google.com/search?site=&source=hp&ei=mpkeWIvHKYWbsgGtxaSQBg&q=%D8%A7%D9%85%D9%8A%D8%B1%D8%B9%D8%A8%D8%A7%D8%B3+%D9%81%D8%AE%D8%B1%D8%A7%D9%88%D8%B1&oq=%D8%A7%D9%85%D9%8A%D8%B1%D8%B9%D8%A8%D8%A7%D8%B3+%D9%81%D8%AE%D8%B1%D8%A7%D9%88%D8%B1&gs_l=mobile-gws-hp.3...4752.15339.0.16567.0.0.0.0.0.0.0.0..0.0....0...1c.1.64.mobile-gws-hp..0.0.0.UFWL1tf4KDM#scso=uid_WB6ZrwAGHJ0KLAXLjA8j8w_10:2120,uid_WB6aQQAGpZkKLNwFPgmnbA_10:2120

【问题讨论】:

  • 我无法在 Chrome 中复制该问题 - window.location.href 应始终返回当前页面 url 唯一我认为它可能不是使用 HTML5 更改的实例历史 API。您是否使用了特定的浏览器或进程来产生此问题?
  • @Brian 感谢您的回答,我会在日志中添加额外选项以查看客户端用户代理,我会尽快通知您
  • @Brian 添加到问题中的一些客户端 UA 示例
  • 我仍然无法使用 UA 欺骗和 chrome“仿真”重现该问题。我以为我之前提到过,但你确定它是记录 location.href 而不是 document.referrer 吗?我唯一的其他想法是主页上可能没有出现问题 - 可能将 GET 请求记录到内联脚本/div 中以便可以通过您的日志记录脚本传回可能会有所帮助,以便我们可以手动映射请求一个 url 并尝试缩小我们如何重现问题
  • @Brian 是的,我确定要使用 location.href,不幸的是我不明白你在说什么。 :(

标签: javascript location-href


【解决方案1】:

试试这个

var myurl = location.origin + decodeURIComponent(location.pathname);

基本上与 location.href 相同,但它应该可以工作

【讨论】:

  • @Hossein Shahsahebi 你有时间检查一下吗?
【解决方案2】:

我实际上无法重现该错误,在我进行的所有少数测试中,您的代码得到了正确的 location.href。

我能想到的唯一问题是您在构建课程时正在创建链接。

var my_obj = {
     /*...*/
     url: "http://sd.domain.ir/index.php?r=" + Math.floor(Math.random() * (1e8 + 1)) + "0&ref=" + (window.btoa ? btoa(location.href) : "ie") + "&responsive=" + (document.querySelector('meta[name="viewport"][content*="width=device-width"]') ? "yes" : "no") + "&params=",
     /*...*/
}
my_obj.init();

这样做意味着url实际上是在加载.js文件时填充的。

你得到的绝对是一个引荐来源网址,比如在旧版本的 android 浏览器中你实际上在 location.href 更改之前加载了脚本,或者有某种预取(比如浏览器从下一页加载内容之前实际上是转到下一页)继续。

在 dom 加载后获取 location.href 应该会更好。您可以尝试在获取 href 之前检查您所处的状态:

var my_obj = {
     init: function(){
            my_obj.url =  "http://sd.domain.ir/index.php?r=" +Math.floor(Math.random() * (1e8 + 1)) + "0&ref=" + (window.btoa ? btoa(location.href) : "ie") + "&responsive=" + (document.querySelector('meta[name="viewport"][content*="width=device-width"]') ? "yes" : "no") + "&params=";
     }
     /*...*/,
     url: ""
}

if(document.readyState == "uninitialized" || document.readyState == "loading "  || document.readyState == "loaded"){
    document.onreadystatechange = function(){
        if (document.readyState == "interactive") {
            my_obj.init();
         }
    } 
}else{
   my_obj.init();
}

【讨论】:

  • 感谢您的回复,但问题是在readystatechange 上启动url_show 为时已晚,无法使用变量。
  • 但我更改了代码来处理这个变量,并且处理得足够晚
  • @HosseinShahsahebi 我想问一下,如果您等待就绪状态从未初始化更改为加载或已加载,您是否可以使其工作,更好的是,您可以检查您的 init 函数以了解您当前的状态,以查看如果您应该立即创建或等待。
  • 我尝试了你说的场景,但没有成功,谢谢你的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 2020-10-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多