nodejsとexpressjsを使用しています。request.headers.protocol
clientRequestオブジェクトのようなものがあるのだろうか。Webリンク用のbaseUrlを作成したいと思います。したがって、リクエストがhttps経由で行われた場合は、すべてのリンクでhttpsを保持したいと思います。
var baseUrl = request.headers.protocol + request.headers.host;
編集: Expressの場合、より安全で使用することをお勧めしますreq.secure
(@Andyが以下で推奨しているように)。同様の実装を使用しますが、将来の使用に対して安全であり、オプションでX-Forwarded-Proto
ヘッダーもサポートします。
そうは言っても、ユースケースでは、またはのいずれかであるExpressのプロパティを使用する方が速いでしょreq.protocol
う。ただし、発信リンクについては、を参照するだけで、ブラウザは現在のプロトコルを使用することに注意してください。(すべてのhttp://リンクを//だけに変更できますか?も参照してください)http
https
//example.com/path
Request
Expressのないノードオブジェクトの場合:
req.connection.secure
(ブール値)にあります。
編集:ノード0.6.15以降 のAPIが変更されました:
HTTPS接続にはreq.connection.encrypted
(SSL接続に関する情報を持つオブジェクト)があります。HTTP接続には。がありませんreq.connection.encrypted
。
また(ドキュメントから):
HTTPSをサポートしている場合は、request.connection.verifyPeer()およびrequest.connection.getPeerCertificate()を使用して、クライアントの認証の詳細を取得します。
req.secure
の省略形はreq.protocol === 'https'
あなたが探しているものでなければなりません。
アプリをプロキシの背後で実行する場合は、「trust proxy」を有効にreq.protocol
して、クライアントとプロキシ間の通信に使用されているプロトコルを反映します。
app.enable('trust proxy');
URLでプロトコルを指定する必要がないため、この問題を気にする必要はありません。
ブラウザを使用する場合<img src="//mysite.comm/images/image.jpg" />
、ページがHTTPで提供される場合はHTTPを使用し、ページがHTTPSで提供される場合はHTTPSを使用します。別のスレッドで@JukkaK.Korpelaの説明を参照してください。
純粋な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];
}
リクエストがhttpかhttpsかを知りたい場合は、コードでこれを使用してください。
req.headers.referer.split(':')[0];
これにより、reqがhttpまたはhttpsのどちらであるかが返されます。
これは私のために働いた:
req.headers['x-forwarded-proto']
これがお役に立てば幸いです。
E
これは私のために働くものです:
getAPIHostAndPort = function(req, appendEndSlash) {
return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : '');
}
リクエストモジュールを使用していて、たとえば、一部の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があなたに与えたように。
Nginxなどのプロキシサーバーを使用している場合はproxy_set_header X-Forwarded-Proto https;
、その構成ファイルで設定する必要があります。そのため、 TSL
expressを使用している場合はhttps
、req.headers['x-forwarded-proto']
値またはtrue
req.secure
リクエストプロトコル文字列を検索する場合:httpまたは(TLSリクエストの場合)httpsのいずれかを使用します
req.protocol
Expressドキュメント:https ://expressjs.com/en/4x/api.html#req.protocol