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}`;
Điểm tốt về URL gốc và yêu cầu HTTP thô. – gilly3
'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
@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. –