【发布时间】:2013-12-31 12:00:13
【问题描述】:
我正在使用 nodejs 和 express 将所有 http 请求重定向到 https。通常浏览器会成功重定向到 https,但通常可以输入带有 http(或没有任何协议)的 url,但似乎不会重定向:页面加载但 url 栏保持为 mysite.com,没有 https 或锁定图标。
这在 Chrome 和 IE 中都可能发生。发生这种情况时,Chrome 网络记录器会混合显示 304 和 302 响应。这是否意味着存在某种缓存导致浏览器无法重定向到 https?
var express = require('express'),
path = require('path'),
http = require('http'),
https = require('https'),
fs = require ('fs');
var app = express();
var options = {
key: fs.readFileSync('cert/rsa.key'),
cert: fs.readFileSync('cert/rsa.crt'),
ca: fs.readFileSync('cert/sub.class1.server.ca.pem')
};
function requireHTTPS(req, res, next) {
if (!req.secure) {
return res.redirect('https://' + req.get('host') + req.url);
}
next();
}
app.use(requireHTTPS);
app.use('/path/html', express.static(rootFolder + 'path/html'));
app.use('/path/fonts', express.static(rootFolder + 'path/fonts'));
app.all('*', function (req, res) {
res.sendfile('index.html', { root: rootFolder + 'path/' });
})
https.createServer(options, app).listen(443);
http.createServer(app).listen(80);
编辑 - 复制技巧
我正在为 express 使用推荐的 https 重定向方法,所以我怀疑许多网站在没有意识到的情况下遇到了这个问题。对于 W7 上的 Chrome,我总是在第一次访问或使用 url 自动完成或多功能框下拉菜单时看到正确的重定向。但是,如果我输入 url 或手动编辑自动完成,那么我可以可靠地看到失败的重定向:
删除 chrome 浏览器缓存
输入您的网址
http://_mysite.com并回车 => 正确重定向到https://_mysite.com创建一个新选项卡,输入您的网址,直到它自动完成并按 Enter => 正确重定向到
https://_mysite.com创建一个新选项卡,如 3。但在按 Enter 之前,通过删除最后一个字符并重新键入来编辑自动完成,按 Enter => 页面呈现,但 url 保持在
http://_mysite.com没有锁定符号。
服务器日志显示未获取根静态页面,仅获取页面内容的某些部分。尽管浏览器没有报告这一点,但对页面内容的所有获取请求都是 https。
【问题讨论】:
-
@daw 抱歉,我无法在 Mac 上使用 Chrome 复制它:(
标签: javascript redirect express browser-cache