2015-08-05 15 views
13

Trong ứng dụng hapijs của tôi, được cung cấp Request object, làm cách nào tôi có thể tìm URL gốc, chưa được phân bổ, chưa sửa đổi?Cách nhận URL đầy đủ cho một yêu cầu trong Hapi

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

Tôi đã phát hiện ra rằng tôi có thể mảnh nó lại với nhau một chút từ Request.info.host, Request.path, và Request.query, nhưng nó thiếu các chương trình (ví dụ, http vs https), và là một chút của một kludge. URL đơn giản có ở đâu đó không?

Trả lời

28

URL đầy đủ không được lưu trữ ở đâu đó mà bạn có thể tải. Bạn cần tự xây dựng nó từ các phần:

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

Mặc dù nó có vẻ có vẻ kludgey, nhưng có ý nghĩa nếu bạn nghĩ về nó vì không có URL gốc, chưa được phân loại, chưa sửa đổi. Yêu cầu HTTP mà đi qua dây dẫn không chứa URL như gõ vào thanh địa chỉ trình duyệt ví dụ:

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 
... 

Và bạn chỉ biết giao thức dựa trên việc kết nối máy chủ HAPI đang ở chế độ TLS hay không (request.connection.info.protocol).

Những điều cần phải nhận thức của

Nếu bạn kiểm tra một trong hai:

request.connection.info.uri hoặc request.server.info.uri

tên máy báo cáo sẽ là hostname của máy thực tế rằng máy chủ đang chạy trên (các đầu ra của hostname trên * nix). Nếu bạn muốn các máy chủ thực tế người đó gõ vào trình duyệt (có thể khác nhau), bạn cần phải kiểm tra request.info.host được phân tách từ tiêu đề chủ yêu cầu HTTP của)

Proxy và X-Forwarded-Proto tiêu đề

Nếu yêu cầu của bạn được chuyển qua proxy/cân bằng tải/thuật ngữ HTTPS, có thể ở đâu đó dọc theo dòng HTTPS Lưu lượng truy cập HTTPS đã bị chấm dứt và được gửi đến máy chủ của bạn trên kết nối HTTP, trong trường hợp này bạn sẽ muốn sử dụng giá trị của tiêu đề x-forwarded-proto nếu ở đó:

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

Với mẫu dây:

const url = `${request.headers['x-forwarded-proto'] || request.connection.info.protocol}://${request.info.host}${request.url.path}`; 
+1

Điểm tốt về URL gốc và yêu cầu HTTP thô. – gilly3

+0

'request.connection.info.protocol' không phải là giải pháp tốt. Nếu bạn cần để có được giao thức tốt hơn sử dụng 'request.headers ['x-forwarded-proto']' – Petroff

+0

@Petroff cảm ơn, cập nhật câu trả lời của tôi với một lưu ý về proxy. –

0

tôi sử dụng cú pháp sau bây giờ (sử dụng kịch bản cà phê):

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

Hoặc như 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); 
}); 

Cung cấp cho bạn URL chính xác như người dùng yêu cầu nó.

0

Bạn không thể nhận được URL. Bạn phải tạo ra nó. Tôi đang sử dụng cái này:

const url = request.headers['x-forwarded-proto'] + '://' + 
      request.headers.host + 
      request.url.path; 
Các vấn đề liên quan