如何检测网页是从网站还是本地文件系统运行

Posted

技术标签:

【中文标题】如何检测网页是从网站还是本地文件系统运行【英文标题】:How to detect if a web page is running from a website or local file system 【发布时间】:2010-10-13 04:59:42 【问题描述】:

我是 javascript 的新手。如何检测我的 javascript 是从网站 (http://) 还是本地文件运行。

【问题讨论】:

【参考方案1】:
switch(window.location.protocol) 
   case 'http:':
   case 'https:':
     //remote file over http or https
     break;
   case 'file:':
     //local file
     break;
   default: 
     //some other protocol

【讨论】:

这不是真的。站点可以在本地托管,并且在本地托管在 Web 服务器上时仍然使用“http”协议。 我明白你在说什么,下面的答案解决了这个问题,但我认为原始发帖人是根据他的问题的措辞具体询问 http: vs. file: 协议。 【参考方案2】:

用于同时测试不同“种类”的本地:

// Returns the page location type
// 0 (falsey) = Local file, direct from disk (file://path/to/file.html)
// 1 (truthy) = Virtually remote file, from local server (http://localhost)
// 2 (truthy) = Remote file from remote server (http://example.com)

function locationType()
    if( window.location.protocol == 'file:' ) return 0; 
    if( !window.location.host.replace( /localhost|127\.0\.0\.1/i, '' ) ) return 2; 
    return 1;

基本原理:您可能希望测试该页面是 a) 在远程服务器上,还是 b) 在本地服务器上(同一台计算机,用于测试,例如使用 AMP),或 c) 本地文件,直接检索通过“file://”协议从磁盘获取。

请注意,这并不能处理所有可能的边缘情况。例如,您可以在技术上将不同的 IP 重定向到“localhost”,而其他非“file://”方案(如“foo://”)实际上可能代表本地访​​问。但它适用于大多数情况,并且可以根据需要进行调整

仅对“http”和“https”进行测试有点受限,因为世界各地正在使用数十种其他 LAN 和 WAN 网络方案。当然,它们是否是本地的,甚至是否可以使用 HTML/JS 代码可能会有所不同 (IANA URI Schemes)。

【讨论】:

不是我这样做的确切方式,但赞成检查本地主机。 @Matthias 是的,诚然有点尴尬,但为了我自己的使用,我想要一个函数,如果我想确保它是一个“真实的”本地文件,我可以测试它的真/假,但如果我想知道它是否在 localhost/remote 上,也可以测试整数值。如果太复杂,您可以将其拆分为三个不同的函数,并将正则表达式拆分为 ( window.location.host == 'localhost' || window.location.host == '127.0.0.1' || window.location.host == '' )【参考方案3】:

与同样处理可能端口的@Beejor 相比,我使用了稍微修改的版本。它允许为 e 设置基础 uriHost。 G。如果作为本地文件运行而不是通过 SSH 隧道或直接通过 IP:Port 运行,则可能需要主机部分的 ajax/jquery 请求。检测部分处于if-else条件。

var uriHost = "";
if (window.location.protocol === "file:") 
  console.log("Running as local file!");
  // like: file://<path>/index.html
  uriHost = "http://<my-host-or-ip>:<my-port>";
 else if (
  !window.location.host.replace(/(localhost|127\.0\.0\.1)(:\d+)?/i, "")
) 
  console.log("Running on local server (ssh tunnel etc.)");
  // like: "http://127.0.0.1:<my-port>"
 else 
  console.log("Running normally, via web server");
  // like: "http://<my-host-or-ip>:<my-port>"

// now do something with uriHost, e.g. for ajax uris etc.

检查是否作为本地文件运行(即file://)只检查window.location.protocol === "file:"就足够了。

【讨论】:

【参考方案4】:

其他方法:

if (/^h/.test(document.location)) 
  // remote file over http or https
 else 
  // local file

if (document.location.host) 
  // remote file over http or https
 else 
  // local file

或(slow,不推荐)

if ((''+document.location).indexOf('http') === 0) 
// if (document.location.protocol.indexOf('http') === 0)  // another way
  // remote file over http or https
 else 
  // local file

【讨论】:

以上是关于如何检测网页是从网站还是本地文件系统运行的主要内容,如果未能解决你的问题,请参考以下文章

运行php程序文件占用多大内存

网站安全检测漏洞检测dedecms本地文件包含

网站安全检测漏洞检测dedecms本地文件包含

怎么对网站进行本地域名解析 HOSTS文件如何删除

是否可以判断正在加载的网页是远程还是本地?

在 PHP 中,如何检测执行是从 CLI 模式还是通过浏览器? [复制]