Request
object が与えられた私のhapijsアプリでは、元の解析されていない、変更されていないURLをどのようにして見つけることができますか?
function getRequestUrl (request) {
return ...; // What goes here?
}
Request.info.Host
、Request.path
、Request.query
からいくらか組み合わせることができることがわかりましたが、スキーム(httpとhttps)が欠けており、クラッジ。プレーンURLはどこかで利用できませんか?
完全な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}`;
_
hapi-url は、この正確な問題を解決します。 X-Forwardedヘッダーを使用してプロキシの背後で実行する準備ができています。ライブラリーがURLを正しく解決できない場合に、自動解決をオーバーライドするオプションもあります。
今は次の構文を使用しています(コーヒースクリプトを使用)。
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が得られます。
URLを取得できません。生成する必要があります。私はこれを使っています:
const url = request.headers['x-forwarded-proto'] + '://' +
request.headers.Host +
request.url.path;