如何在原生Node.js中获取请求协议?
原生Node.js中获取请求协议并实现HTTP到HTTPS重定向
嘿,刚好我之前也踩过这个坑!原生Node.js确实不像Express那样直接给你一个req.protocol属性,但用内置模块就能轻松搞定,完全不用依赖框架~
核心判断逻辑:检查连接的加密状态
在原生Node.js的http/https模块里,请求对象(req)的socket属性藏着关键信息:
- 如果是HTTPS请求,
req.socket.encrypted会返回true - 如果是HTTP请求,这个属性会是
false(直接判断!req.socket.encrypted就够了)
实现HTTP到HTTPS重定向的完整示例
下面是一个可直接运行的HTTP服务器代码,会自动把所有HTTP请求重定向到对应的HTTPS地址:
const http = require('http'); // 创建HTTP服务器,专门处理重定向逻辑 const httpServer = http.createServer((req, res) => { // 确认当前是HTTP请求 if (!req.socket.encrypted) { // 构造HTTPS重定向URL:替换端口为你的HTTPS端口(比如本地常用8443) const httpsUrl = `https://${req.headers.host.replace(':8000', ':8443')}${req.url}`; // 发送301永久重定向(对搜索引擎更友好) res.writeHead(301, { 'Location': httpsUrl, 'Content-Type': 'text/plain' }); res.end(`正在跳转到HTTPS地址:${httpsUrl}`); return; } // 这里不会走到(当前是HTTP服务器),仅做兜底 res.end('这是HTTP服务器'); }); httpServer.listen(8000, () => { console.log('HTTP服务器已启动:http://localhost:8000'); });
配套HTTPS服务器示例(可选)
如果需要同时运行HTTPS服务器,你需要先准备SSL证书(本地可以用openssl生成自签名证书),然后用以下代码启动:
const https = require('https'); const fs = require('fs'); // 加载你的SSL证书和密钥(替换成自己的文件路径) const sslOptions = { key: fs.readFileSync('./private-key.pem'), cert: fs.readFileSync('./certificate.pem') }; // 创建HTTPS服务器 const httpsServer = https.createServer(sslOptions, (req, res) => { // 这里可以验证协议:req.socket.encrypted 会返回true console.log(`收到${req.socket.encrypted ? 'HTTPS' : 'HTTP'}请求:${req.url}`); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('欢迎访问HTTPS服务器!'); }); httpsServer.listen(8443, () => { console.log('HTTPS服务器已启动:https://localhost:8443'); });
关于本地访问看不到协议标识的说明
你访问localhost:8000时浏览器地址栏没显示http://,是因为浏览器默认会隐藏HTTP协议的标识(HTTPS则会显示小锁+https://),但实际上这个请求确实是HTTP协议的,我们的判断逻辑完全有效。
内容的提问来源于stack exchange,提问作者yevg
相关产品推荐
相关产品推荐

