从请求脚本的位置获取主机

Get host from where script has been requested

本文关键字:获取 主机 位置 请求 脚本      更新时间:2023-09-26

我有一个脚本,其他人在他们的网站上向我的主机请求。我有多个环境(dev/test/production),在我的脚本中,我想知道加载它的环境。

例如,我在以下站点为script.js提供服务(所有站点的文件都相同):

dev.mysite.com/script.js
test.mysite.com/script.js
www.mysite.com/script.js

有人将我的脚本加载为:

<script src="dev.mysite.com/script.js"></script>

因此,在script.js中,我希望有一些代码能够获得请求脚本的主机:

var getHost = function() {
  var host = // host from where it has been requested
  return host; // in this case it should return dev.mysite.com
};

我怎样才能做到这一点?

我很难理解您真正想要的是什么,但您可以遍历所有脚本并解析src

jQuery:

function getHosts(scriptName){
   var hosts  = [];
   scriptName = scriptName.replace(/([.])/g,"''$1"); // escape special characters
   $('script').each(function(){
      var _src    = this.src;
      if ( RegExp(scriptName).test(_src) ){
         _src = _src.replace(/^https*:'/'//,'');     // remove protocol
         _src = _src.replace(/'/.*$/,'');            // remove rest of path
         hosts[hosts.length] = _src;                 // store it for return
      }
   });
   return hosts;                                     // return results as array
}
alert( getHosts('script.js').join(',') );

不带jQuery:

function getHosts(scriptName){
   var hosts  = [];
   scriptName = scriptName.replace(/([.])/g,"''$1"); // escape special characters
   var scripts = document.getElementsByTagName('script');
   for (var n=scripts.length;n--;){
      var _src = scripts[n].src;
      if ( RegExp(scriptName).test(_src) ){
         _src = _src.replace(/^https*:'/'//,'');     // remove protocol
         _src = _src.replace(/'/.*$/,'');            // remove rest of path
         hosts[hosts.length] = _src;                 // store it for return
      }
   }
   return hosts;                                     // return results as array
}
alert( getHosts('test.js').join(''n') );

我认为如果不对脚本的服务方式进行一些更改,这是不可能的。我认为您需要将主机名硬编码到脚本声明的某个变量中,并在脚本文件从devtest再到www时进行更改。或者,您可以使用例如PHP动态插入值。

示例:在您的脚本中,您将拥有类似的内容

var myscript = {
    // declare a 'namespace'
    stage = '__STAGE_PLACEHOLDER__';
    myfunc = function(args) {
        ...
    }
    // your code goes here
};

在服务之前,将__STAGE_PLACEHOLDER__替换为dev/test/www,然后可以使用myscript.stage进行内省。

如果您希望env依赖于脚本的路径,而不是包含它的页面,那么window.location将不起作用。您可以为每个env创建一个不同的js脚本,其中包含一个自定义的getHost()函数,即:

var getHost = function () {
  return "dev";
}

为了避免拥有多个脚本的开销,您可以在服务器端动态生成此附加函数。

您也可以要求用户自己定义环境,即:

MyApp.config.env = 'dev';

来自Mozilla开发者网站window.location:参考

window.location.hostname // the host name (without the port number or square brackets)