Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google chrome extension cors+;s3和x2B;浏览器缓存&x2B;扩充功能_Google Chrome Extension_Amazon S3_Cors_Browser Cache - Fatal编程技术网

Google chrome extension cors+;s3和x2B;浏览器缓存&x2B;扩充功能

Google chrome extension cors+;s3和x2B;浏览器缓存&x2B;扩充功能,google-chrome-extension,amazon-s3,cors,browser-cache,Google Chrome Extension,Amazon S3,Cors,Browser Cache,对。这是一个复杂的问题。我会尽量简明扼要 我的网站从s3获取资源。 我还有一个扩展名,当有人执行google查询时,需要预取s3文件,所以稍后当他们进入我的站点时,资源会被缓存。 在这一点上,我可能应该强调,我没有做任何恶意的事情。只是用户体验的问题。 我的问题是。在扩展上向s3发出ajax请求(无论是从内容脚本还是从后台)都不会发送原始标头。 这意味着资源在下载和缓存时没有allow origin标头。s3 不添加允许来源:*如果请求中没有来源。因此,稍后,在我的站点上,由于缓存文件中缺少al

对。这是一个复杂的问题。我会尽量简明扼要

我的网站从s3获取资源。 我还有一个扩展名,当有人执行google查询时,需要预取s3文件,所以稍后当他们进入我的站点时,资源会被缓存。 在这一点上,我可能应该强调,我没有做任何恶意的事情。只是用户体验的问题。 我的问题是。在扩展上向s3发出ajax请求(无论是从内容脚本还是从后台)都不会发送原始标头。 这意味着资源在下载和缓存时没有allow origin标头。s3 不添加允许来源:*如果请求中没有来源。因此,稍后,在我的站点上,由于缓存文件中缺少allow origin标头,所以失败:-(

有没有更好的方法来预取浏览器缓存的想法

有没有一种方法可以强制ajax请求发送一个来源?任何来源? 因为我有一个allow origin:*在我的s3存储桶上,我认为任何origin都会接受null。 谢谢

编辑:最终使用了Rob W的一个解决方案。你太棒了。 让我谈谈他提出的每一个选择:

  • 不要在我的清单上添加主机前置任务——这是一个聪明的主意,但对我来说不起作用,因为我有一个在任何网站上运行的内容脚本,所以我必须使用一个通配符,我认为没有“排除”权限选项

  • 我试过了,它发出了一个空原点,正如预期的那样,最终在S3中根据需要发送allow origin:*头。这意味着我没有得到“allow origin header missing”的消息错误,但是文件不是从缓存中提供的。我想要从chrome中的缓存中实际提供文件,它必须是完全相同的来源。所以这非常接近,但还不够

  • 第三个选项是一个符咒。这是最简单的。我不知道我能够操纵来源标题。所以我这样做,并设置了我网站的确切来源-它可以工作。文件被缓存,然后从缓存中提供。我必须强调,我必须添加一个Url过滤器,以仅将其应用于发送到s3存储桶的请求,否则我会花费很多时间这将对用户的浏览器造成严重破坏


  • 谢谢。干得好

    您有三个选择:

  • 不要将S3的主机权限添加到您的清单文件中。这样扩展名就没有访问资源的总体权限,并且将随请求一起发送
    Origin
    请求头
  • 使用非扩展帧来执行AJAX请求。例如,以下方法将导致跨源GET请求,并且
    origin:null

    函数prefetchWithOrigin(url){
    var html='('+函数(url){
    var x=新的XMLHttpRequest();
    x、 打开('GET',url);
    x、 onloadend=函数(){
    parent.postMessage('done','*');
    };
    x、 send();
    }+)(“+JSON.stringify(url)+”);”;
    var f=document.createElement('iframe');
    f、 src='data:text/html',+encodeURIComponent(html);
    (document.body | | document.documentElement).appendChild(f);
    window.addEventListener('message',函数侦听器(事件){
    //完成后移除框架
    if(event.source==f.contentWindow){
    removeEventListener('message',listener);
    f、 删除();
    }
    });
    }
    
  • 使用事件手动附加原始标题

  • @如果在清单文件的
    权限
    部分中未指定主机权限,则不允许Ilanlewin跨源XHR,即使存在具有“匹配”模式的内容脚本。尝试一下,您将看到
    源代码:chrome扩展名://[origin]
    https://google.com/
    是在没有源站权限的情况下访问的。此功能是设计的,因此可以依赖。Rob,我不知道你最后一条评论的确切意思,但我在清单文件中对一般权限和内容脚本都有一般权限…比如“权限”:[“http://*/*”、“https://*/*”、“内容脚本”:[{“匹配项”:[“http://*/*”、“https://*/*”]、@Ilanlewin,如果您试图使用AJAX访问的网站的URL(XMLHttpRequest)如果不匹配您的
    权限
    数组中的任何一个,则Chrome将添加一个
    来源
    标题。是否在
    内容脚本
    中的
    匹配
    中指定主机与此无关。从
    权限
    中删除
    http://*/*
    https://*/*
    ,Chrome将包含一个
    来源
    请求标头。