2012-04-27 45 views
40

Tôi đang sử dụng nút bấm và biểu thức. Tôi tự hỏi nếu có một cái gì đó như request.headers.protocol trong đối tượng clientRequest. Tôi muốn xây dựng baseUrl cho các liên kết web. Vì vậy, nếu yêu cầu được thực hiện qua https tôi muốn giữ https trong tất cả các liên kết.Cách biết yêu cầu là http hoặc https trong node.js

var baseUrl = request.headers.protocol + request.headers.host; 

Trả lời

62

Chỉnh sửa: Để thể hiện, an toàn hơn và được khuyến nghị sử dụng req.secure (như @Andy đề xuất bên dưới). Trong khi nó sử dụng một triển khai tương tự, nó sẽ được an toàn để sử dụng trong tương lai và nó cũng tùy chọn hỗ trợ tiêu đề X-Forwarded-Proto.

Điều đó đang được nói, đối với trường hợp sử dụng của bạn, bạn sẽ nhanh chóng sử dụng thuộc tính Express 'req.protocol, là http hoặc https. Tuy nhiên, lưu ý rằng đối với các liên kết đi, bạn chỉ có thể tham khảo //example.com/path và trình duyệt sẽ sử dụng giao thức hiện tại. (Xem thêm Can I change all my http:// links to just //?)

Đối với nút Request đối tượng mà không cần Express:

Đó là trong req.connection.secure (boolean).

Edit: API đã thay đổi, cho Node 0.6.15+:

Một kết nối HTTPS có req.connection.encrypted (một đối tượng với thông tin về các kết nối SSL). Kết nối HTTP không có req.connection.encrypted.

Ngoài (từ the docs):

Với sự hỗ trợ HTTPS, sử dụng request.connection.verifyPeer() và request.connection.getPeerCertificate() để có được thông tin chi tiết xác thực của khách hàng.

+3

Điều này vẫn có sẵn trong nút mới nhất 0.10 trở lên không? – CMCDragonkai

+1

Hm, bạn có thể xác minh điều này cho các phiên bản nút sau này như 0.8 và lên, tôi không thể tìm thấy bất kỳ thứ gì trong loại tài liệu này. Nhưng có thể là tôi đang đọc sai chỗ. – Olga

+0

Điều này vẫn tồn tại trong Node v5.x. – Ben

4

Bạn không cần phải chỉ định giao thức trong URL, do đó bạn không cần phải bận tâm đến vấn đề này.

Nếu bạn sử dụng <img src="//mysite.comm/images/image.jpg" /> trình duyệt sẽ sử dụng HTTP nếu trang được phân phối trong HTTP và sẽ sử dụng HTTPS nếu trang được phân phối trong HTTPS. Xem the @Jukka K. Korpela explanation trong một chuỗi khác.

+1

Cảm ơn Gerardo, bạn là đúng nhưng đối với dự án này, tôi cần phải phát hiện giao thức. – aartiles

+0

Nhưng điều này không đúng đối với các ứng dụng toàn cầu, trên máy chủ, bạn phải chỉ định giao thức –

2

này đã làm việc cho tôi:

req.headers['x-forwarded-proto'] 

Hy vọng điều này giúp,

E

+2

Lưu ý rằng thao tác này sẽ chỉ hoạt động nếu ứng dụng của bạn chạy phía sau proxy ngược đặt tiêu đề này - đó là một ý tưởng hay, nhưng có thể không phải là trường hợp đặc biệt trong ví dụ môi trường dev cục bộ. (Ngoài ra, hãy nhớ rằng nếu bạn không * đằng sau proxy, khách hàng có thể giả mạo tiêu đề, vì vậy hãy cẩn thận cách bạn tin tưởng nó.) – natevw

+0

Ngoài ra, trong một số trường hợp, bạn không phải là máy chủ http! –

+0

Tôi đang sử dụng OpenShift, và đây là câu trả lời đúng cho dịch vụ đó (req.secure và req.protocol không hoạt động); chỉ nghĩ rằng tôi muốn đề cập trong trường hợp người khác cũng vậy. – iangilman

34

req.secure là viết tắt của req.protocol === 'https' nên được những gì bạn đang tìm kiếm.

Nếu bạn chạy ứng dụng của mình sau proxy, hãy bật 'ủy thác proxy' để req.protocol phản ánh giao thức được sử dụng để liên lạc giữa máy khách và proxy.

app.enable('trust proxy');

+0

@caub http://expressjs.com/en/api.html#req.protocol – Andy

+0

oh phải, nhầm lẫn với 'require ('url'). Parse (..). Protocol ' – caub

+2

Cuộc gọi thú vị khi đề cập đến' ứng dụng. enable ('trust proxy'); ' Không sử dụng điều này đã gây ra một vòng lặp chuyển hướng. –

3

Nếu bạn muốn biết liệu yêu cầu là http hoặc https sau đó sử dụng điều này trong mã của bạn req.headers.referer.split (':') [0]; này sẽ trở lại dù req là http hoặc https

1

Nếu bạn đang sử dụng mô-đun yêu cầu và ví dụ muốn biết những gì giao thức thực hiện một số sử dụng www, bạn có thể sử dụng: response.request.uri.protocol

request(YOUR_TARGET, function(error, response, body){ 
    if (error){ 
     console.log(error); 
    } 
    else { 
     console.log(response.request.uri.protocol); // will show HTTP or HTTPS 
    } 
}); 

Nếu bạn cần giao thức người dùng, hãy sử dụng request.headers.referer.split (':') [0]; giống như @Harsh cung cấp cho bạn.

1

Đối với NodeJS tinh khiết (chỉ hoạt động này tại địa phương và triển khai, ví dụ như sau Nginx):

function getProtocol (req) { 
    var proto = req.connection.encrypted ? 'https' : 'http'; 
    // only do this if you trust the proxy 
    proto = req.headers['x-forwarded-proto'] || proto; 
    return proto.split(/\s*,\s*/)[0]; 
} 
0

Trong một hàm:

function getBaseUrl(req) { 
    return req.protocol + '://' + req.headers.host + '/'; 
} 

var baseUrl = getBaseUrl(request); // Example: http://localhost:3000/ 
Các vấn đề liên quan