2017-04-04 13 views
1

heroku(nginxはインストールされていません)でホストされているSails.js WebAppをhttp://からhttps://に強制して使用しますエクスプレスでsails.jsアプリケーションでhttp://からhttps://に強制する

それは次のようになります:私は私のsails.jsアプリで私のconfig/http.jsファイルでそれを使用しようとした

app.use(forceDomain({ 
    hostname: 'www.example.com', 
    port: 4000, 
    protocol: 'https' 
})); 

:私のsail.jsアプリでこのexpress middleware

middleware: { 

     forceDomain: function (req, res, next) { 
      forceDomain({ 
       hostname: 'www.myurl.com', 
       port: 4000, 
       protocol: 'https' 
      }); 
      next(); 
     }, 

     order: [ 
      'forceDomain', 
      ... 
} 

この「app.use()」の使い方はわかりません。セイルの事.js。 here explainedですが、私は本当に理解できませんでした。私が今持っているものは動作しません(エラーもリダイレクトもありません)。これをどうすれば解決できますか?

インストール済みthis module - どちらも動作しません。

+0

私はそれがforceDomainであるべきだと思います:forceDomain({hostname ... etc})、 – yBrodsky

+0

それはまったく意味がありません。 hmm – Suisse

+0

nginx(リバースプロキシとして)を使用している場合は、そこで実行できます。 – Sangharsh

答えて

2

order以外)sails.config.http.middleware辞書内のすべての値は、Expressスタイルのミドルウェア機能する必要があります - まさにforcedomainモジュールの戻りである、resreqを受け入れる関数であり、next。あなたのコードの問題は、関数を返すのではなく、別の関数でその関数をラップしていることです。試してみてください:

これは、ファイルの先頭にvar forceDomain = require('forcedomain')があることを前提としています。ここで

+0

ありがとうございます。正しいと思われるが、私のアプリでは動作しません。エラーはありませんが、リダイレクトは発生しません。では、このリダイレクトの問題をsails.jsで解決する方法は? – Suisse

+1

私は 'forcedomain'モジュールを書いておらず、それが何をしているのかを保証することはできませんが、もしそれがうまくいくなら、それはあなたがやる方法です! – sgress454

+0

true、ソリューションが正しいように見えました。ありがとう:)私はモジュールなしでそれを解決しました。 – Suisse

1

はnginxのなしと外部モジュールなしでHerokuの上で実行されているsails.jsアプリでSSLを強制する方法ソリューションです:

のconfig/http.jsファイルでカスタムミドルウェアの例があります:

**************************************************************************** 
*  Example custom middleware; logs each request to the console.  * 
**************************************************************************** 

myRequestLogger: function (req, res, next) { 
     console.log("Requested :: ", req.method, req.url); 
     next(); 
} 

私は要求が安全であれば制御独自のカスタムミドルウェア機能を作った、とされていない場合、それはhttpsに要求をリダイレクトします://またはそのWebSocketの要求は、それがWSSへの要求をリダイレクトする場合://

order: [ 
     ... 
     'forceSSL', 
      ... 
     ], 


forceSSL: function (req, res, next) { 

      if (req.isSocket) { 
       return res.redirect('wss://' + req.headers.host + req.url); 
      } else if (req.headers["x-forwarded-proto"] == "http") { 
       return res.redirect('https://' + req.headers.host + req.url); 
      } else { 
       next(); //it's already secure 
      } 
} 

externモジュールや接続は必要ありません。その機能だけで動作します。

+0

これを共有していただきありがとうございます。websocketを動作させるために何か特別な処理をしなければなりませんでしたか?私はまた、アプリケーションロードバランサを使って「WebSocketハンドシェイク中にエラーが発生しました:予期しないレスポンスコード:502」というnginxを使わずにsails.js(ドッカー)を実行しています。1インスタンスのwebsocketはうまく動作しますが、2回以上インスタンスを追加すると接続が解除され始めます... – Aaron

関連する問題