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の1つを試しました、そしてそれはopenlayersが1を持っていないことがわかりました

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

次に、Openstreet jsをダウンロードしてクライアントサーバーでホストしましたが、すべてのスタイルと関連画像が失われました。地図は表示されますが、基本的にはコンソールに多数の警告ポップアップが表示され、Playストアなどで拒否される可能性があります。私もサーバー上で実行されるハイブリッドアプリケーションを開発しています。

警告

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

OpentreetのGitHubリポジトリ全体をダウンロードしました。これで画像とCSSの問題は解決すると思います。

https://github.com/openlayers/openlayers

上記でCSSの問題解決しましたが、マップは別の外部サイトから画像をロードすることで表示されますtile.openstreet.com。私もopenstreet jsを掘り下げる必要があるようです.. :( ..


重要:backbone.jsを使用しています。

OpenLayers 2.12とhttp基本認証の問題を経験しましたが、それでも役に立ちませんでした。サーバー構成を制御できません。他のすべてが正常に機能するようにWebサイトをセットアップする必要があるフォルダーにアクセスできますが、このSSLは面倒です。

Googleがリンクしないように実際のウェブサイトのアドレスを変更しました。


2
自分のサーバーで.JSファイルをホストしない理由はありますか?これにより、純粋なSSLが可能になり、ドメイン間の競合が回避されます。
マッパー2014年

@Mapper:最初にそれを行いましたが、スクリプトはcssや画像などの外部リソースを呼び出します。2番目の更新を参照してください。アイブ氏は.. ..私は彼らがあまりにもSSLを追加しない限り、これは問題に残るだろうと思い、今欠けているものを説明した
ロイMJ

すべての資産などは相対的にリンクされているので、私見は問題ありません。例:on-i.de/map
Mapper

@マッパー:はい、私はそれを理解しました..しかし、タイルはこの方法で動かなくなったものです..それは私のアプリケーションを壊しませんが、警告を表示しますが、実際にはたくさんの警告を表示します。数日検索して、これに対する解決策があるかどうかを確認してください...
Roy MJ

これらのjsファイルは常にローカルでホストする必要があります。そうしないと、APIを変更してOpenLayersを更新すると、サイトが台無しになる可能性があります。
scai 2014年

回答:


11
  • OpenLayers.js:libをダウンロードしてアプリケーションサーバーにリンクすることをお勧めします。このようにして、URLとコンテンツを完全に制御できます。

  • 「安全でないコンテンツ」の警告:私にも起こりました。OpenLayers 2.13.1では、OpenLayers.Layer.OSMをインスタンス化すると、デフォルトでHTTP用に構成されます。OpenLayers.Layer.OSM docから:

url {String}タイルセット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 2018年

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)

コードオーバーライドフィールドは、ウィジェットを新しいメディアイベントにフォームします。これhttp://openlayers.org/api/2.13.1/OpenLayers.jsにより、メディアのhttpコンテンツが削除されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.