16

1 つの html サイトと、その Web サイトを提供する 1 つの node.js サーバーがあります。Web サイトとサーバーは、socke.io を使用してデータを交換します。ドキュメントでこれを見つけました:

origins のデフォルト *:* は、Socket.IO サーバーへの接続が許可されているオリジンです。

私たちの html.site は にありhttp://questionexample.com/page1ます。このサイトだけが私たちのサーバーに接続できます (ただし、その Web サイトには誰でも接続できます)。オリジンをどのように設定する必要がありますか?

4

5 に答える 5

43

Socket.io ソース コードを掘り下げると、次のような行が見つかります。

var origin = request.headers.origin || request.headers.referer
  , origins = this.get('origins');

...

var parts = url.parse(origin);
parts.port = parts.port || 80;
var ok =
  ~origins.indexOf(parts.hostname + ':' + parts.port) ||
  ~origins.indexOf(parts.hostname + ':*') ||
  ~origins.indexOf('*:' + parts.port);

ご覧のとおり、Socket.io はクライアントから送信されたオリジン (またはリファラー) を取得し、ドメイン名とポートを取得して、指定したoriginsオプションと比較します。

したがって、有効なorigins値は次のとおりです ( *「任意」を意味します)。

  • testsite.com:80
  • http://testsite.com:80
  • http://*:8080
  • *:8080
  • testsite.com:* http://someotherdomain.com:8080 (スペースで区切られた複数のオリジン)
  • testsite.com:*/somepath (socket.io は /somepath を無視します)
  • *:*

そして、これらは無効です (ポート番号がないため):

  • testsite.com
  • http://testsite.com
  • http://testsite.com/somepath

sub.testsite.comまた、origins 値として指定すると、有効なオリジンtestsite.comとなることに注意してください。

于 2014-02-11T19:29:07.237 に答える
2

の新しいバージョンsocket.io(現在まで4.x.x) では、サーバー オプションの一部として CORS オリジンを設定する必要があります。

CORS は独自のモジュールに分割されました。詳細については、readmeを参照してください。

デフォルトの構成は次のとおりです。

{
  "origin": "*",
  "methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
  "preflightContinue": false,
  "optionsSuccessStatus": 204
}

サブドメインの使用を 1 つのサイトに制限する。

cors: {
        origin: [/\.example\.com$/],
        methods: ["GET", "POST"]
        }

これは、express や生の socket.io エンジン以外のものを使用せずに見に来る人のための、非常に単純で基本的な構成ブロックです。編集: のバージョン 3 用に更新されましたsocket.io

// Options for socket.io => 3.0.0
var options = {
        allowUpgrades: true,
        transports: [ 'polling', 'websocket' ],
        pingTimeout: 9000,
        pingInterval: 3000,
        cookie: 'mycookie',
        httpCompression: true,
        cors: '*:*' <---- Allow any origin here [NOTE THE NAME CHANGE]
};

古いバージョンの使用;

// Options for socket.io > 1.0.0
var options = {
        allowUpgrades: true,
        transports: [ 'polling', 'websocket' ],
        pingTimeout: 9000,
        pingInterval: 3000,
        cookie: 'mycookie',
        httpCompression: true,
        origins: '*:*' <---- Allow any origin here
};

io = require('socket.io')(8010, options);
于 2019-01-05T15:54:46.957 に答える
-2

io.set('origins', http://questionexample.com/page1)やるべきだと思う

于 2013-04-02T19:17:36.197 に答える