从不同的域加载CSS,然后从Javascript访问它

Did*_*ier 5 javascript css security cross-domain

我想将我的网站分散到不同的服务器上,并为此目的使用子域。

xttp://site.com将提供主要的php文件xttp://static.site.com将提供css和js xttp://content.site.com将提供图像等

(xttp可以防止stackoverflow表单认为它是url)

对于为什么,请阅读以下内容。

但是,当我尝试通过javascript访问任何CSS规则时遇到问题。准确地说是NS_ERROR_DOM_SECURITY_ERR。这是一种相对较新的安全措施,与防止跨域脚本编写有关。

过去,有解决此问题的措施,包括仅关闭此保护。这不再起作用。

我的问题:

无论如何,如果它来自其他域而不是主页,则可以通过javascript访问正常加载的CSS规则?

JavaScript:

MUI.getCSSRule=function(selector){
    for(var ii=0;ii<document.styleSheets.length;ii++){
        var mysheet=document.styleSheets[ii];
        var myrules=mysheet.cssRules?mysheet.cssRules:mysheet.rules;
        for(i=0;i<myrules.length;i++){
            if(myrules[i].selectorText==selector){
                return myrules[i]
                }
            }
        }
    return false
};
Run Code Online (Sandbox Code Playgroud)

用绝对路径从html加载javascript和css

并且网站网址是“ http://site.com”

这两个域都完全在我的控制之下,但是它们是独立的机器(暂时是虚拟的,但即使有可能,在生产中它们甚至可能不在同一位置)

改写问题:

有什么方法可以让Firefox和其他浏览器知道即使域名不同,也应该将某些域视为相同?

为什么?因此,我可以轻松地使用具有各自配置,针对其任务进行了优化的不同服务器。一台用于php的快速机器,一台用于静态内容的简单机器,一台用于内容的大型机器。

为什么?费用。静态服务器通常很少需要安全性来防止任何人下载文件。它的内容很少,因此不需要昂贵的阵列。只需将其加载到内存中并从那里进行服务即可。也可以限制内存本身,请尝试一下。至少就我而言,PHP服务器通常将需要大量内存,冗余存储和大量日志记录。内容服务器将需要大量的存储和大量的带宽,但是在CPU能力方面却相对较少。每种硬件/主机要求不同。微调每个参数不仅可以提供更好的性能,而且还可以降低托管成本,对我而言,至少这仍然是运行网站的最大成本之一。

Bri*_*ell 3

CORS(跨域资源共享)是一种允许站点选择跨域访问资源的标准。我不知道 Firefox 是否将其应用到 CSS 上;我知道它适用于 XMLHttpRequest,并且旨在适用于大多数其他跨域请求限制,但我还没有在您的精确用例中测试它。

您可以将以下标头添加到响应中static.site.com,以允许您的主页访问从那里提供的资源内容:

Access-Control-Allow-Origin: http://site.com
Run Code Online (Sandbox Code Playgroud)

或者甚至,如果您不认为您的任何内容属于static.site.com敏感内容:

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

Mozilla 开发者网络上提供了更多信息。

  • 谢谢,尝试过这个,但它似乎只按照ajax指示工作。不适用于以正常方法加载的 CSS 文件。一直在进一步寻找,这可能还不可能,也看不到大佬们在这样做。似乎为了安全起见,在网络服务器上分配负载的最简单和最便宜的形式已经被安全性破坏了。 (2认同)