在SSL中使用OpenLayers映射


10

我通过使用托管的JavaScript使用OpenLayers映射:

<script src="http://openlayers.org/api/2.13.1/OpenLayers.js"></script> 

但是我的客户端已安装SSL,当我尝试运行地图页面时,它显示:

(2)[blocked] The page at https://domain.com/rwd/ ran insecure content 
   from http://openlayers.org/api/2.13.1/OpenLayers.js.

所以我尝试了一个https,结果证明openlayers没有一个

https://openlayers.org/api/2.13.1/OpenLayers.js

然后,我下载了Openstreet js并将其托管在客户端服务器中,但是所有样式和相关图像都丢失了。尽管它确实显示了地图,但控制台中基本上会弹出许多警告,我担心这可能会在play store左右被拒绝。我正在开发在服务器上也运行的混合应用程序。

现在警告

The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8743/5624.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8742/5624.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8743/5623.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8743/5625.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8744/5624.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://a.tile.openstreetmap.org/14/8742/5623.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8742/5625.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://a.tile.openstreetmap.org/14/8744/5623.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://a.tile.openstreetmap.org/14/8744/5625.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://a.tile.openstreetmap.org/14/8743/5622.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8742/5622.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8745/5624.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8744/5622.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://b.tile.openstreetmap.org/14/8745/5623.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8745/5625.png.
The page at https://domain.com/rwd/#/customer-plot/234 displayed insecure content from http://c.tile.openstreetmap.org/14/8745/5622.png.

GET https://domain.com/rwd/js/lib/theme/default/style.css 404 (Not Found) 
/*This the corresponding stylesheet that is loaded via Openstreet.js*/ 

我尝试使用带有SSL的cdn和仍然相同的问题:

https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.11/OpenLayers.js

我下载了Openstreet的整个GitHub存储库,认为这将解决图像和CSS问题。

https://github.com/openlayers/openlayers

尽管以上解决了CSS问题,但是通过从另一个外部站点加载图像来显示地图tile.openstreet.com。似乎我也必须深入研究openstreet js。


重要提示:我正在使用bone.js。

注意:我经历了OpenLayers 2.12和http基本身份验证问题,但这对我没有帮助。我对服务器配置没有任何控制。我只需要访问一个文件夹,即可在该文件夹中设置网站,其他所有内容都可以正常运行,但是此SSL很麻烦。

更改了真实的网站地址,以避免Google链接它。


2
为什么没有在自己的服务器上托管.JS文件的原因?这将允许使用纯SSL,并避免跨域冲突。
Mapper 2014年

@Mapper:我首先这样做,但是随后脚本调用了一些外部资源,如CSS,图像等。请参阅我的第二次更新。香港专业教育学院解释什么是现在缺少的。我认为,这将仍然是一个问题,除非他们添加SSL太..
罗伊MJ

所有资产等都是相对链接的,所以恕我直言没有问题。例如:on-i.de/map
Mapper,

@Mapper:是的,我想出了..但是,瓷砖是这种方法所困扰的..它不会破坏我的应用程序,但是会显示警告,实际上是很多警告。几天的时间来寻找,看看是否有任何可能的解决方案...
Roy MJ 2014年

您应该始终在本地托管这些js文件。否则,带有API修改的OpenLayers更新可能会破坏您的网站。
scai 2014年

Answers:


11
  • OpenLayers.js:我建议您下载该库并将其链接到您的应用程序服务器。这样,您可以完全控制其URL和内容。

  • “不安全的内容”警告:这也发生在我身上。在OpenLayers 2.13.1中,当实例化OpenLayers.Layer.OSM时,默认情况下将其配置为HTTP。来自OpenLayers.Layer.OSM doc

url {String} tileet URL方案。默认为http:// [a | b | c] .tile.openstreetmap.org / $ {z} / $ {x} / $ {y} .png

取而代之的是,我为URL方案数组使用了显式值,其中包含与协议无关的URL

layer = new OpenLayers.Layer.OSM(
    "OpenStreetMap", 
    // Official OSM tileset as protocol-independent URLs
    [
        '//a.tile.openstreetmap.org/${z}/${x}/${y}.png',
        '//b.tile.openstreetmap.org/${z}/${x}/${y}.png',
        '//c.tile.openstreetmap.org/${z}/${x}/${y}.png'
    ], 
    null);
  • 与协议无关的URL:如果要让您的应用程序同时在HTTP和HTTPS上运行,请使用与协议无关的URL:而不是http://server.com/resource,请使用//server.com/resource:您的浏览器将考虑当前运行的协议。

如果有人想知道:您可以在OpenLayers.js源代码中进行更改。即使已经缩小,也很容易找到和更改。
trainoasis

3

官方的OSM切片服务器不提供通过SSL的任何访问。它们是公共物品,不应被流量大的应用使用。如果仍然要使用它们,则必须在浏览器中显示“某些内容未加密”消息。

如果要进行完全加密,则需要使用SSL购买商业地图CDN:


3
该信息显然是旧的。Openstreetmap现在支持https;检查openstreetmap.org。另见github.com/openstreetmap/openstreetmap-website/issues/1033
Antonis Christofides

1

您需要覆盖表格Widget。例:

from django.contrib import admin
from django.contrib.gis.db import models
from django.contrib.gis.forms.widgets import BaseGeometryWidget

class CustomOpenLayersWidget(BaseGeometryWidget):
    template_name = 'gis/openlayers.html'

    def __init__(self, attrs=None):
        super(CustomOpenLayersWidget, self).__init__(attrs)

    class Media:
        js = (
            'https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js',
            'gis/js/OLMapWidget.js',
        )


class CustomModelAdmin(admin.ModelAdmin):
    """Need to change default URL of OpenLayers"""
    formfield_overrides = {
        models.PointField: {"widget": CustomOpenLayersWidget},
        models.PointField: {"widget": CustomOpenLayersWidget},
        models.PolygonField: {"widget": CustomOpenLayersWidget},
        models.LineStringField: {"widget": CustomOpenLayersWidget},

        # Adding other models Fields if need
    }

并更改管理员班级

@admin.register(Position)
class PositionAdmin(CustomModelAdmin):
    pass

模型的例子

class Position(models.Model):
    point = models.PointField(blank=False)

代码覆盖字段构成了新媒体itite的小部件。这将删除http://openlayers.org/api/2.13.1/OpenLayers.js媒体的http内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.