Access-Control-Allow-Origin不允许原点为空

我创建了一个小的xslt文件来创建一个名为weather的html输出。XSL的代码如下:

<!-- DWXMLSource="http://weather.yahooapis.com/forecastrss?w=38325&u=c" -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="yweather"
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>


<xsl:template match="/">
<img src="{/*/*/item/yweather:condition/@text}.jpg"/>
</xsl:template>
</xsl:stylesheet>

我想在html输出加载到一个div的html文件,我试图使用jQuery,如下所示:

<div id="result">
<script type="text/javascript">
$('#result').load('weather.xsl');
</script>
</div>
但是我得到以下错误: Access-Control-Allow-Origin不允许原点为空

我读过关于向xslt添加头文件的文章,但我不确定如何做到这一点,因此如果能提供任何帮助,我将不胜感激,如果在html输出中加载无法通过这种方式完成,那么关于如何进行此操作的其他建议将非常有用。

326974 次浏览

null是本地文件系统,因此这表明您正在加载通过file:/// URL执行load调用的HTML页面(例如,只需在本地文件浏览器或类似的地方双击它)。

大多数浏览器甚至不允许从与文档相同的目录加载文件,从而将同源策略应用于本地文件。(它曾经是Firefox允许相同的目录和子目录,但不再是了

基本上,在本地资源中使用ajax是行不通的。

如果你只是在本地测试一些你真正要部署到web上的东西,而不是使用本地文件,安装一个简单的web服务器并通过http:// url进行测试。这样你就能更准确地了解安全状况。您的IDE很可能内置了某种服务器(直接或通过扩展),让您只需点击“运行”即可。在IDE中,让服务器启动并提供文件。

Chrome和Safari对本地资源使用ajax有限制。这就是为什么它会抛出一个错误

Access-Control-Allow-Origin不允许原点为空。

解决方案:使用firefox或将数据上传到临时服务器。如果你还想使用Chrome浏览器,从下面的选项开始;

--allow-file-access-from-files

更多信息如何添加上述参数到您的Chrome:右键单击任务栏上的Chrome图标,右键单击弹出窗口上的谷歌Chrome,单击属性并在快捷方式选项卡下的目标文本框内添加上述参数。它将如下所示;

C:\Users\XXX_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

希望这对你有所帮助!

我想谦虚地补充说,根据这个SO来源:https://stackoverflow.com/a/14671362/1743693,这种麻烦现在部分解决简单地使用以下jQuery指令:

<script>
$.support.cors = true;
</script>

我在IE10.0.9200上试用了它,它立刻就工作了(使用jquery-1.9.0.js)。

在chrome 28.0.1500.95 -这个指令不起作用(这发生在上面链接的评论中大卫抱怨)

用——allow-file-access-from-files运行chrome浏览器对我不起作用(正如Maistora上面所说的那样)

添加一点使用Gokhan的解决方案:

--allow-file-access-from-files
现在你只需要在目标文本中添加上面的文本,后面跟着一个空格。 确保你在添加以上属性后关闭了所有chrome浏览器的实例。 现在重新启动chrome的图标,你添加了这个属性。

只是想补充一句,“运行web服务器”的答案似乎相当令人生畏,但如果你的系统上有python(至少在MacOS和任何Linux发行版上默认安装),它就像:

python -m http.server  # with python3

python -m SimpleHTTPServer  # with python2

因此,如果你的html文件myfile.html在一个文件夹中,比如说mydir,你所要做的就是:

cd /path/to/mydir
python -m http.server  # or the python2 alternative above

然后将浏览器指向:

http://localhost:8000/myfile.html

这样就完成了!在所有的浏览器上工作,不禁用web安全,允许本地文件,甚至用命令行选项重新启动浏览器。

我正在寻找一个解决方案,从本地html文件向服务器发出XHR请求,并使用Chrome和PHP找到了一个解决方案。(没有Jquery)

javascript:

var x = new XMLHttpRequest();
if(x) x.onreadystatechange=function(){
if (x.readyState === 4 && x.status===200){
console.log(x.responseText); //Success
}else{
console.log(x); //Failed
}
};
x.open(GET, 'http://example.com/', true);
x.withCredentials = true;
x.send();

我的Chrome浏览器的请求头Origin: null

我的PHP响应头(注意,'null'是字符串)。HTTP_REFERER允许从一个远程服务器到另一个远程服务器的跨起源。

header('Access-Control-Allow-Origin: '.(trim($_SERVER['HTTP_REFERER'],'/')?:'null'),true);
header('Access-Control-Allow-Credentials:true',true);

我能够成功连接到我的服务器。 你可以忽略凭证头,但这适用于我Apache的AuthType Basic启用

我测试了与FF和Opera的兼容性,它可以在很多情况下工作,如:

从虚拟机的LAN IP (192.168.0.x)返回到虚拟机的WAN (public) IP:端口
.x
.从虚拟机局域网IP返回到远端服务器域名 从本地的。html文件到虚拟机的LAN IP和/或VM的WAN IP:端口,
从本地的。html文件到远程服务器域名

你可以使用source标签加载一个本地Javascript文件(在你的file:/源页面下面的树中):

<script src="my_data.js"></script>

如果你把输入编码成Javascript,就像这样:

mydata.js:

$xsl_text = "<xsl:stylesheet version="1.0" + ....

(这对json来说更容易)然后你就有了你的“数据”在Javascript全局变量中,可以随心所欲地使用。