web-dev-qa-db-ja.com

Hapiでリクエストの完全なURLを取得する方法

Request object が与えられた私のhapijsアプリでは、元の解析されていない、変更されていないURLをどのようにして見つけることができますか?

function getRequestUrl (request) {
    return ...; // What goes here?
}

Request.info.HostRequest.pathRequest.queryからいくらか組み合わせることができることがわかりましたが、スキーム(httpとhttps)が欠けており、クラッジ。プレーンURLはどこかで利用できませんか?

17
gilly3

完全なURLは、取得できる場所に保存されていません。パーツから自分で構築する必要があります。

_const url = request.connection.info.protocol + '://' + request.info.Host + request.url.path_;

元の、解析されていない、変更されていないURLが存在しないため、考えにくいと思われるかもしれません。ネットワーク経由で送信されるHTTPリクエストには、たとえばブラウザーのアドレスバーに入力されたURLが含まれていません。

_GET /hello?a=1&b=2 HTTP/1.1      // request.url.path
Host: localhost:4000             // request.info.Host
Connection: keep-alive
Accept-Encoding: gzip, deflate, sdch
...
_

そして、あなたは、hapiサーバー接続がTLSモードであるかどうかに基づいてプロトコルを知っているだけです(_request.connection.info.protocol_)。

注意事項

次のいずれかをチェックした場合:

_request.connection.info.uri_または_request.server.info.uri_

報告されるホスト名は、サーバーが実行されている実際のマシンのホスト名になります(* nixのhostnameの出力)。ブラウザに入力した実際のホスト(異なる場合があります)が必要な場合は、HTTPリクエストのホストヘッダーから解析される_request.info.Host_を確認する必要があります)

プロキシとX-Forwarded-Protoヘッダー

リクエストがプロキシ/ロードバランサー/ HTTPSターミネーターを通過した場合、HTTPSトラフィックが途中で終了し、HTTP接続でサーバーに送信された可能性があります。この場合は、次の値を使用します。 _x-forwarded-proto_ヘッダー(ある場合):

const url = (request.headers['x-forwarded-proto'] || request.connection.info.protocol) + '://' + request.info.Host + request.url.path;

テンプレート文字列で:

_const url = `${request.headers['x-forwarded-proto'] || request.connection.info.protocol}://${request.info.Host}${request.url.path}`;
_
38
Matt Harrison

hapi-url は、この正確な問題を解決します。 X-Forwardedヘッダーを使用してプロキシの背後で実行する準備ができています。ライブラリーがURLを正しく解決できない場合に、自動解決をオーバーライドするオプションもあります。

2
rigon

今は次の構文を使用しています(コーヒースクリプトを使用)。

server.on 'response', (data) ->
  raw = data.raw.req
  url = "#{data.connection.info.protocol}://#{raw.headers.Host}#{raw.url}"
  console.log "Access to #{url}"

またはjavascriptとして:

​server.on('response', function(data) {
  var raw = data.raw.req;
  var url = data.connection.info.protocol + "://" + 
  raw.headers.Host + raw.url;
  console.log("Access to " + url);
});

これにより、ユーザーが要求したとおりの正確なURLが得られます。

0
Alinex

URLを取得できません。生成する必要があります。私はこれを使っています:

const url = request.headers['x-forwarded-proto'] + '://' +
            request.headers.Host + 
            request.url.path;
0
Petroff