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

Origin null is not allowed by Access-Control-Allow-Origin

提问人:dudledok 提问时间:12/10/2011 最后编辑:Mir-Ismailidudledok 更新时间:1/28/2023 访问量:342872

问:

我制作了一个小的 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>

我想将 html 输出加载到 html 文件中的 div 中,我尝试使用 jQuery 执行此操作,如下所示:

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

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

我已经阅读了有关向 xslt 添加标头的信息,但我不确定该怎么做,因此任何帮助将不胜感激,如果无法以这种方式加载 html 输出,那么关于其他方法的建议会很棒。

javascript null xmlhttprequest cors localhost

评论

0赞 T.J. Crowder 12/10/2011
这是你的实际电话吗?上面根本没有路吗?load
0赞 Maksim Shamihulau 1/6/2021
要允许文件系统中的本地 pages/html 文件 () 访问外部资源(不同来源),这些外部资源应使用 in response 标头进行响应。Origin: null"Access-Control-Allow-Origin": "*"

答:

251赞 T.J. Crowder 12/10/2011 #1

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

大多数浏览器将同源策略应用于本地文件,甚至不允许从与文档相同的目录中加载文件。(过去,Firefox允许使用相同的目录和子目录,但现在不再允许了。

基本上,将 ajax 与本地资源一起使用是行不通的。

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

评论

1赞 dudledok 12/11/2011
上传后,我不再得到 Origin null,但我仍然得到“Access-Control-Allow-Origin 不允许”。
3赞 T.J. Crowder 12/11/2011
如果您加载的资源如您所示 (),则不应该发生这种情况,因为请求显然指向同一来源。如果您尝试从其他地方(例如,)加载,那么您将再次遇到 SOP,但方式不同。Ajax 请求仅限于同一源(请参阅答案中的链接),或者如果您使用的是启用了 CORS 的浏览器,并且服务器支持 COR,则服务器可以选择是否允许跨请求。$('#result').load('weather.xsl');$('#result').load('http://somewhere.else/weather.xsl');
3赞 Ciaran Gallagher 2/24/2013
设置简单 Web 服务器的最简单、最快捷的方法是什么?IIS会是最简单的方法吗?
14赞 Dave Liepmann 7/26/2013
@CiaranG我从命令行运行,然后转到localhost:8000,为我工作。Python 预装在 Mac OS X 中;如果使用其他操作系统,则可能需要安装。python -m SimpleHTTPServer
2赞 WBT 9/16/2021
对于那些后来遇到这种情况的人,在 CVE-2019-11730 之后,Firefox 不再允许这种有限的访问。
224赞 Gokhan Tank 11/7/2012 #2

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

Access-Control-Allow-Origin 不允许 Origin null。

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

--allow-file-access-from-files

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

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

希望这会有所帮助!

评论

21赞 Bruno Bernardino 2/3/2013
在 Mac OS X 中,您可以通过打开终端并输入以下内容来启动 Chrome: 请注意,最后的 & 只是为了让您继续使用终端,这不是必需的。注意:如果您关闭终端,它将关闭 Chrome 窗口。/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files &
3赞 mplungjan 6/25/2013
做了这一切,关闭了又打开了。仍然不行(XP 上的 Chrome 27.0.1453.116 m)
0赞 Rick 5/23/2014
我无法在 Windows 8 下添加此参数...,任何知道如何操作的人?...
0赞 Andy 12/4/2015
我正在从 Web 服务器运行。这到底是怎么回事?如何确定它在哪里加载本地文件?
0赞 alex 1/21/2016
当我尝试将--allow-file-access-from-files添加到目标路径时,我得到一个“....invalid“消息,这个解决方案仍然有效吗?
1赞 orberkov 8/20/2013 #3

我想谦虚地补充一点,根据这个 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 上面声称的那样)

1赞 saurabh 11/20/2013 #4

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

--allow-file-access-from-files

现在,您只需要在目标文本中附加上面的文本,后跟一个空格。 确保在添加上述属性后关闭 Chrome 浏览器的所有实例。 现在,通过添加此属性的图标重新启动 chrome。 它应该对所有人都有效。

评论

0赞 jnns 11/21/2013
Ghokan Tank 已经提供了该参数,找出如何始终让浏览器以该参数启动不是问题的一部分。此外,您不能假设每个人都使用 Microsoft Windows。
73赞 gozzilli 3/8/2014 #5

只是想补充一点,“运行 Web 服务器”的答案似乎令人生畏,但如果您的计算机上有 python(至少在 MacOS 和任何 Linux 发行版上默认安装),它就像以下几部分一样简单:

python -m http.server  # with python3

python -m SimpleHTTPServer  # with python2

因此,如果您的 html 文件在一个文件夹中,请说 ,您所要做的就是:myfile.htmlmydir

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

然后将浏览器指向:

http://localhost:8000/myfile.html

大功告成!适用于所有浏览器,无需禁用 Web 安全性、允许本地文件,甚至无需使用命令行选项重新启动浏览器。

评论

3赞 Aragorn 10/5/2015
Windows 上的 python 3 等效项是:python -m http.server [<portNo>]
1赞 João Nunes 4/30/2018
Python 3:python3 -m http.server
1赞 rodrigocfd 1/13/2020
Linux 上的 Python 2,选择 8080 端口(或您想要的任何其他端口):python -m SimpleHTTPServer 8080
0赞 netskink 6/16/2023
虽然这很酷,但遗憾的是它并没有解决我的 cors 问题。嘎,我希望我能更多地了解 cors。这是对至少一些很酷的东西的点赞。
0赞 Barry McDermid 6/30/2023
需要一个快速的 CORS 测试机制,这非常有效,非常感谢。
0赞 Louis Loudog Trottier 1/29/2020 #6

我一直在寻找一种解决方案,从本地 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);

我能够成功连接到我的服务器。 您可以忽略 Credentials 标头,但这在启用 Apache 时对我有用AuthType Basic

我测试了与 FF 和 Opera 的兼容性,它适用于多种情况,例如:

从 VM LAN IP (192.168.0.x) 返回到 VM 的 WAN(公共)IP:端口
从 VM LAN IP 返回到远程服务器域名。
从本地 .HTML 文件到 VM LAN IP 和/或 VM WAN IP:端口,
从本地 .HTML 文件到远程服务器域名。
等等。

-1赞 Rich 3/3/2020 #7

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

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

如果您将输入编码为 Javascript,例如在本例中:

mydata.js

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

(这对 json 来说更容易)然后,您可以在 Javascript 全局变量中拥有“数据”,可以根据需要使用。

评论

0赞 us_david 7/11/2022
这正是OP遇到的问题。您的解决方案不起作用。
-1赞 piero B 1/28/2023 #8

使用 Java Spring 运行 Web 服务,您需要在自动生成的 YouAppApplication.java 文件(带有 main() 函数的文件)的正上方添加: 并使用以下实现创建一个类:@ServletComponentScan@SpringBootApplication

@WebFilter("/*")
public class AddResponseHeaderFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // ...
    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
        httpServletResponse.addHeader("Access-Control-Allow-Origin", "null");

        httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");
         filterChain.doFilter(servletRequest, servletResponse);

    }

    @Override
    public void destroy() {
        // ...
    }
}

请注意,您可以在此类实现 Filter 并具有注释后立即为其选择不同的名称,您还可以提供与此筛选器不同的通配符,因此此筛选器不适用于每个终结点。
根据 Loudog Trottier @Louis指定,您需要在创建 Ajax 请求时添加它才能正常工作。
@WebFilter/*...withCredentials = true;