Подтвердить что ты не робот

Как получить полный URL-адрес для запроса в Хапи

В моем приложении hapijs, заданном Request объекте, как я могу найти оригинальный, не проанализированный, немодифицированный URL?

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

Я обнаружил, что могу объединить его несколько с Request.info.host, Request.path и Request.query, но ему не хватает схемы (т.е. http vs https), и это немного kludge. Не доступен ли простой URL-адрес?

4b9b3361

Ответ 1

Полный URL-адрес не сохраняется там, где вы можете его получить. Вам нужно построить его самостоятельно из частей:

const url = request.connection.info.protocol + '://' + request.info.host + request.url.path;

Даже если это может показаться kludgey, это имеет смысл, если вы думаете об этом, потому что нет оригинального, не проанализированного, немодифицированного 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

указанное имя хоста будет именем хоста фактического компьютера, на котором работает сервер (вывод hostname on * nix). Если вы хотите, чтобы фактический хост набрал человека в браузере (который может быть другим), вам нужно проверить request.info.host, который разобран из заголовка хоста HTTP-запроса)

Прокси и заголовок 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}`;

Ответ 2

Теперь я использую следующий синтаксис (используя кофе script):

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-адрес, который был запрошен пользователем.

Ответ 3

Вы не можете получить URL-адрес. Вы должны создать его. Я использую этот:

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