Access-Control-Allow-Origin不允许使用null

dud*_*dok 176 html jquery cors

我创建了一个小的xslt文件来创建一个名为weather.xsl的html输出,其代码如下:

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

我想将html输出加载到html文件中的div中,我正在尝试使用jQuery,如下所示:

<div id="result">
<script type="text/javascript">
$('#result').load('weather.xsl');
</script>
</div>
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:Access-Control-Allow-Origin不允许使用Origin null.

我已经阅读过有关向xslt添加标题的内容,但我不知道该怎么做,所以任何帮助都会受到赞赏,如果在html输出中加载不能这样做,那么建议如何这样做会很棒.

T.J*_*der 222

Origin null是本地文件系统,因此建议您加载load通过file:///URL 进行调用的HTML页面(例如,只需在本地文件浏览器或类似文件中双击它).不同的浏览器采用不同的方法将同源策略应用于本地文件.

我的猜测是你使用Chrome看到这个.Chrome将SOP应用于本地文件的规则非常严格,甚至不允许从与文档相同的目录中加载文件.Opera也是如此.其他一些浏览器(如Firefox)允许有限访问本地文件.但基本上,使用ajax与本地资源不能跨浏览器工作.

如果您只是在本地测试一些您将真正部署到Web上的内容,而不是使用本地文件,请安装一个简单的Web服务器并通过http://URL进行测试.这为您提供了更准确的安全图片.

  • @CiaranG我从命令行运行`python -m SimpleHTTPServer`然后转到localhost:8000,为我工作.Python预装了Mac OS X; 如果使用其他操作系统,则可能需要安装. (12认同)
  • 如果你正在加载的资源是你所显示的(`$('#result').load('weather.xsl');`),这不应该发生,因为请求明显是相同的来源.如果您正试图从其他地方加载(例如,`$('#result').load('http://somewhere.else/weather.xsl');`),那么您将遇到SOP再次,但以不同的方式.Ajax请求仅限于相同的*origin*(请参阅回答中的链接),或者如果您正在使用[CORS](http://www.w3.org/TR/access-control/)启用的浏览器和服务器支持COR,服务器可以选择是否允许跨源请求. (3认同)
  • 设置简单Web服务器的最简单,最快捷的方法是什么?IIS是最简单的方法吗? (2认同)
  • 对于后来遇到此问题的人,在 [CVE-2019-11730](https://www.mozilla.org/en-US/security/advisories/mfsa2019-21/#CVE-2019 之后,Firefox 不再允许这种有限的访问-11730)。 (2认同)

Gok*_*ank 215

Chrome和Safari对使用ajax和本地资源有限制.这就是它抛出错误的原因

Access-Control-Allow-Origin不允许使用null.

解决方案:使用firefox或将数据上传到临时服务器.如果您仍想使用Chrome,请使用以下选项启动它;

--allow-file-access-from-files
Run Code Online (Sandbox Code Playgroud)

有关如何将以上参数添加到Chrome的更多信息:右键单击任务栏上的Chrome图标,右键单击弹出窗口中的Google Chrome并单击属性,然后在"快捷方式"选项卡下的"目标"文本框中添加上述参数.它将如下所示;

C:\Users\XXX_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助!

  • +1用于提供比"运行Web服务器"更简单的解决方案 (86认同)
  • 在Mac OS X中,您可以通过打开终端并输入以下命令启动Chrome:`/ Applications/Google\Chrome.app/Contents/MacOS/Google\Chrome --allow-file-access-from-files& `注意最后一个&只是为了你可以继续使用终端而不是必需的.**注意:**如果您关闭终端,它将关闭Chrome窗口. (19认同)
  • 我喜欢这个命题,但它对我没用. (8认同)
  • 完成所有这一切并关闭并打开.仍然没有去(XP上的Chrome 27.0.1453.116米) (3认同)

goz*_*lli 43

只是想补充一点,"运行一个网络服务器"的答案似乎相当令人生畏,但如果你的系统上有python(默认安装至少在MacOS和任何Linux发行版上),它就像下面这样简单:

python -m http.server  # with python3
Run Code Online (Sandbox Code Playgroud)

要么

python -m SimpleHTTPServer  # with python2
Run Code Online (Sandbox Code Playgroud)

因此,如果您将html文件myfile.html放在一个文件夹中mydir,那么您需要做的就是:

cd /path/to/mydir
python -m http.server  # or the python2 alternative above
Run Code Online (Sandbox Code Playgroud)

然后将浏览器指向:

http://localhost:8000/myfile.html
Run Code Online (Sandbox Code Playgroud)

你完成了!适用于所有浏览器,无需禁用Web安全性,允许本地文件,甚至可以使用命令行选项重新启动浏览器.

  • Windows上的python 3等价物是:python -m http.server [<portNo>] (2认同)