Iis KML的图像来自不具有Access\u Control\u Allow\u Origin标头的源

Iis KML的图像来自不具有Access\u Control\u Allow\u Origin标头的源,iis,cors,kml,url-rewrite-module,openlayers-5,Iis,Cors,Kml,Url Rewrite Module,Openlayers 5,我正在使用openlayers,并试图在IIS托管的web应用程序上显示地图中的KML。我正在使用的KML的一个例子是: <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>Test CORS KML</name> <Style id="badCors

我正在使用openlayers,并试图在IIS托管的web应用程序上显示地图中的KML。我正在使用的KML的一个例子是:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
   <Document>
      <name>Test CORS KML</name> 
      <Style id="badCors">
         <IconStyle>
            <color>ff589d0f</color>
            <scale>1</scale>
            <Icon><href>https://www.gstatic.com/mapspro/images/stock/1415-rec-winter-snow.png</href>
            </Icon>
         </IconStyle>
      </Style>
      <Placemark>
         <name>Bad Mark</name>
         <styleUrl>#badCors</styleUrl>
         <Point>
            <coordinates>4.3849582,50.9757646,0</coordinates>
         </Point>
      </Placemark>
   </Document>
</kml>

测试CORS KML
ff589d0f
1.
https://www.gstatic.com/mapspro/images/stock/1415-rec-winter-snow.png
坏分数
#坏蛋
4.3849582,50.9757646,0
这不起作用,但是,我得到一个错误:

在 '' 来自源“”已被CORS策略阻止:否 “Access Control Allow Origin”标头出现在请求的服务器上 资源

如果我更改kml,使图像改为使用url,它将显示良好,没有任何问题

我试图找出如何使用url重写将“访问控制允许源代码”添加到第一个/错误链接,但我所尝试的一切都不起作用。看起来很有希望,但对我来说不起作用。如果我使用像这样的扩展,这就解决了问题,但对于我的情况来说,这不是一个真正的解决方案


显示未在openlayers中为CORS设置的KML图像的最佳方式是什么?

您可能需要在服务器上使用一个简单的代理来绕过CORS,并且您的openlayers源代码设置将需要一个加载器(没有bbox策略,因此中的简化版本)来为href URL添加代理前缀

var vectorSource = new Vector({
  format: new KML(),
  loader: function() {
     var url = 'your-kml.kml;
     var xhr = new XMLHttpRequest();
     xhr.open('GET', url);
     xhr.onload = function(extent, resolution, projection) {
       if (xhr.status == 200) {
         var text = xhr.responseText.replace(
           /\<href\>http/gi,
           '<href>yourproxy?http'
         );
         vectorSource.addFeatures(
           vectorSource.getFormat().readFeatures(text, {
             dataProjection: 'EPSG:4326',
             featureProjection: projection
           })
         );
       }
     }
     xhr.send();
   },
 });
var vectorSource=新向量({
格式:new KML(),
加载程序:函数(){
var url='your-kml.kml;
var xhr=new XMLHttpRequest();
xhr.open('GET',url);
xhr.onload=函数(范围、分辨率、投影){
如果(xhr.status==200){
var text=xhr.responseText.replace(
/\http/gi,
'yourproxy?http'
);
vectorSource.addFeatures(
vectorSource.getFormat().readFeatures(文本{
数据预测:“EPSG:4326”,
特征投影:投影
})
);
}
}
xhr.send();
},
});

如果是您自己的KML,您可以将图像复制到您自己的服务器或本地主机。不幸的是,这不是我的选择。KML来自我的客户我希望出于某种原因会有一个不同的答案,但我可以做到这一点。非常感谢。问题是,允许KML构造函数中的
crossOrigin:null
选项防止对未启用的资源发出CORS请求,就像对任何其他图标一样,这非常简单。