66

nodejsとexpressjsを使用しています。request.headers.protocolclientRequestオブジェクトのようなものがあるのだろうか。Webリンク用のbaseUrlを作成したいと思います。したがって、リクエストがhttps経由で行われた場合は、すべてのリンクでhttpsを保持したいと思います。

    var baseUrl = request.headers.protocol + request.headers.host;
4

10 に答える 10

104

編集: Expressの場合、より安全で使用することをお勧めしますreq.secure(@Andyが以下で推奨しているように)。同様の実装を使用しますが、将来の使用に対して安全であり、オプションでX-Forwarded-Protoヘッダーもサポートします。

そうは言っても、ユースケースでは、またはのいずれかであるExpressのプロパティを使用する方が速いでしょreq.protocolう。ただし、発信リンクについては、を参照するだけで、ブラウザは現在のプロトコルを使用することに注意してください。(すべてのhttp://リンクを//だけに変更できますか?も参照してください)httphttps//example.com/path

RequestExpressのないノードオブジェクトの場合:

req.connection.secure(ブール値)にあります。

編集:ノード0.6.15以降 のAPIが変更されました:

HTTPS接続にはreq.connection.encrypted(SSL接続に関する情報を持つオブジェクト)があります。HTTP接続には。がありませんreq.connection.encrypted

また(ドキュメントから):

HTTPSをサポートしている場合は、request.connection.verifyPeer()およびrequest.connection.getPeerCertificate()を使用して、クライアントの認証の詳細を取得します。

于 2012-04-27T15:15:20.907 に答える
53

req.secureの省略形はreq.protocol === 'https'あなたが探しているものでなければなりません。

アプリをプロキシの背後で実行する場合は、「trust proxy」を有効にreq.protocolして、クライアントとプロキシ間の通信に使用されているプロトコルを反映します。

app.enable('trust proxy');

于 2013-05-06T19:16:51.877 に答える
10

URLでプロトコルを指定する必要がないため、この問題を気にする必要はありません。

ブラウザを使用する場合<img src="//mysite.comm/images/image.jpg" />、ページがHTTPで提供される場合はHTTPを使用し、ページがHTTPSで提供される場合はHTTPSを使用します。別のスレッドで@JukkaK.Korpelaの説明を参照してください。

于 2012-04-27T10:36:42.137 に答える
9

純粋なNodeJSの場合(これはローカルで動作し、Nginxの背後などにデプロイされます):

function getProtocol (req) {
    var proto = req.connection.encrypted ? 'https' : 'http';
    // only do this if you trust the proxy
    proto = req.headers['x-forwarded-proto'] || proto;
    return proto.split(/\s*,\s*/)[0];
}
于 2017-02-21T04:09:10.183 に答える
4

リクエストがhttpかhttpsかを知りたい場合は、コードでこれを使用してください。

req.headers.referer.split(':')[0];

これにより、reqがhttpまたはhttpsのどちらであるかが返されます。

于 2016-10-10T17:27:19.677 に答える
3

これは私のために働いた:

req.headers['x-forwarded-proto']

これがお役に立てば幸いです。

E

于 2012-12-17T18:25:52.317 に答える
2

これは私のために働くものです:

getAPIHostAndPort = function(req, appendEndSlash) {
    return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : '');
}
于 2018-05-23T21:29:02.017 に答える
1

リクエストモジュールを使用していて、たとえば、一部のwwwがどのプロトコルを使用しているかを知りたい場合は、response.request.uri.protocolを使用できます。

request(YOUR_TARGET, function(error, response, body){
    if (error){
        console.log(error);
    }
    else {
        console.log(response.request.uri.protocol); // will show HTTP or HTTPS
    }
});

ユーザープロトコルが必要な場合は、request.headers.referer.split(':')[0];を使用してください。@Harshがあなたに与えたように。

于 2017-02-11T01:04:24.847 に答える
0

Nginxなどのプロキシサーバーを使用している場合はproxy_set_header X-Forwarded-Proto https;、その構成ファイルで設定する必要があります。そのため、 TSLexpressを使用している場合はhttpsreq.headers['x-forwarded-proto']値またはtruereq.secure

于 2019-07-28T03:54:57.193 に答える
0

リクエストプロトコル文字列を検索する場合:httpまたは(TLSリクエストの場合)httpsのいずれかを使用します

 req.protocol

Expressドキュメント:https ://expressjs.com/en/4x/api.html#req.protocol

于 2021-11-05T11:11:43.803 に答える