我正在使用express在我的vps上提供静态文件。
我创建了两个服务器http
和https
,如下所示:
var httpServer = http.createServer(app);
httpServer.listen(httpPort);
var httpsServer = https.createServer(credentials, app);
httpsServer.listen(httpsPort);
使用下面的中间件:
app.use(function (req, res, next) {
!req.secure
? res.redirect(301, path.join('https://', req.get('Host'), req.url))
: next();
});
我的大多数请求都被重定向到https。但是,当我的网站只加载没有ssl(http://example.com)且没有任何子路由(如http://example.com/contact)的域时,这不会重定向到https。
我提供静态文件(为生产编译的角度4应用程序):
app.use(express.static(path.join(__dirname, distFolder)));
我的路线如下:
app.get('*', (req, res) ={
res.sendFile(path.join(__dirname, distFolder, 'index.html'));
});
你可以帮我找出我错过的东西吗?我没有找到这个问题的答案。
谢谢。
答案 0 :(得分:2)
我们还可以使用node-rest-client
正确地重定向到任何网址。
您可以按npm install node-rest-client
答案 1 :(得分:1)
path.join
用于将路径元素连接在一起,不应用于构造URL。在您的示例中,重定向网址将缺少一个主斜杠。
> path.join('https://', 'example.com', '/hello/world')
'https:/example.com/hello/world'
相反,您可以使用url.format
,这将构建一个合适的网址。
> url.format({ protocol: 'https:', host: 'example.com', pathname: '/hello/world' })
'https://example.com/hello/world'
您的代码看起来像这样:
app.use(function (req, res, next) {
if (req.secure) return next()
const target = url.format({
protocol: 'https:',
host: req.get('Host'),
pathname: req.url
})
res.redirect(301, target)
})
答案 2 :(得分:0)
我建议您尝试在Web服务器层而不是应用层上解决此问题,通过80和443同时接收安全和非安全请求/流量。
答案 3 :(得分:0)
我终于找到了问题:我在安全测试>之前正在服务公共文件夹 ...
以下是现在的步骤:
// Step 1: Test all incoming requests (from http and https servers).
app.use(function (req, res, next) {
if (req.secure)
return next();
var target = url.format({ // Thanks Linus for the advice!
protocol: 'https:',
host: req.hostname,
pathname: req.url
});
res.redirect(301, target);
});
// Step 2: Serve static files.
app.use(express.static(path.join(__dirname, 'your/dist/folder')));
// Step 3: Build routes (in my case with * because of the SPA).
app.get('*', function (req, res) {
res.sendFile(path.join(__dirname, 'your/dist/folder', 'index.html'));
});
现在它完美无缺!