Node Express 重定向在生产中的 Safari 中不起作用
Node Express redirect not working in Safari in Production
此路由重定向在 Chrome 和 Firefox 中完全符合我的要求,但由于某种原因,它在生产环境中的 Safari 中不起作用:
var express = require('express');
var router = express.Router();
var pool = require('../modules/pg-pool');
router.get('/', async (req, res) => {
var client = await pool.connect();
try {
var stripeConnectState = req.query.state;
var stripeConnectVendorIdResult = await client.query('SELECT vendor_id ' +
'FROM users_vendors ' +
'WHERE stripe_connect_state=;',
[stripeConnectState])
client.release();
if (stripeConnectVendorIdResult.rows[0] && stripeConnectVendorIdResult.rows[0].vendor_id) {
var stripeConnectVendorId = stripeConnectVendorIdResult.rows[0].vendor_id;
}
if (stripeConnectVendorId) {
var redirectUrl = [req.protocol, '://', req.get('Host'), '/#/account/vendor/details/', stripeConnectVendorId, '?', req.originalUrl.split("?").pop()].join('');
res.redirect(redirectUrl);
} else {
console.log('There was no vendor id to match the stripe state received');
res.sendStatus(403);
}
} catch (e) {
console.log('Error vendor id GET SQL query task', e);
res.sendStatus(500);
}
});
module.exports = router;
对我来说最疯狂的是,当我在 Safari 中进行本地测试时,它成功了!出于某种原因,当我部署到 Heroku 时,它不再适用于 Safari 的生产环境。
当我在本地测试时,它正在重定向到
http://localhost:5000/#/account/vendor/details/7?state=XXXXXXXXXXXXXXXXXXXXXXXX&scope=read_write&code=ac_XXXXXXXXXXXXXXXXXX
但在生产中,它正在重定向到基础 url
https://www.fairlywed.com/
没有 Stripe 发送的极其重要的查询参数。这几乎就像我手头上的竞争条件,在 Chrome 或 Firefox 中永远不会触发,但总是在 Safari 中触发。
我也想知道我对 angular-ui-router 的使用或 stripe 指向我的站点的事实是否可能涉及,但 none 这些确实对我来说很有意义。我现在可能只是在抓住救命稻草。
我找到了一个创可贴解决方案,但我仍然不确定为什么会这样。在生产中,req.protocol
以 http
的形式出现,由我的代码的另一部分处理:
function redirectChecker (req, res, next) {
if (env === 'production') {
if (req.headers['x-forwarded-proto'] !== 'https') {
var urlAfterConversion = ['https://', req.get('Host'), req.url].join('');
return res.redirect(urlAfterConversion);
}
}
return next();
};
出于某种原因,在 Safari 上重定向不起作用(也许 Safari 不接受重定向后跟重定向?)
因此失败并重定向到我的目标网页。我仍然不确定为什么它解决了问题,但这段代码有效:
if (stripeConnectVendorId) {
var env = process.env.NODE_ENV || 'development';
var redirectUrl = [req.protocol, '://', req.get('Host'), '/#/account/vendor/details/', stripeConnectVendorId, '?', req.originalUrl.split("?").pop()].join('');
if (env === 'production') {
redirectUrl = 'https:' + redirectUrl.split(':')[1];
}
res.redirect(redirectUrl);
} else {
console.log('There was no vendor id to match the stripe state received');
res.sendStatus(403);
}
此路由重定向在 Chrome 和 Firefox 中完全符合我的要求,但由于某种原因,它在生产环境中的 Safari 中不起作用:
var express = require('express');
var router = express.Router();
var pool = require('../modules/pg-pool');
router.get('/', async (req, res) => {
var client = await pool.connect();
try {
var stripeConnectState = req.query.state;
var stripeConnectVendorIdResult = await client.query('SELECT vendor_id ' +
'FROM users_vendors ' +
'WHERE stripe_connect_state=;',
[stripeConnectState])
client.release();
if (stripeConnectVendorIdResult.rows[0] && stripeConnectVendorIdResult.rows[0].vendor_id) {
var stripeConnectVendorId = stripeConnectVendorIdResult.rows[0].vendor_id;
}
if (stripeConnectVendorId) {
var redirectUrl = [req.protocol, '://', req.get('Host'), '/#/account/vendor/details/', stripeConnectVendorId, '?', req.originalUrl.split("?").pop()].join('');
res.redirect(redirectUrl);
} else {
console.log('There was no vendor id to match the stripe state received');
res.sendStatus(403);
}
} catch (e) {
console.log('Error vendor id GET SQL query task', e);
res.sendStatus(500);
}
});
module.exports = router;
对我来说最疯狂的是,当我在 Safari 中进行本地测试时,它成功了!出于某种原因,当我部署到 Heroku 时,它不再适用于 Safari 的生产环境。
当我在本地测试时,它正在重定向到
http://localhost:5000/#/account/vendor/details/7?state=XXXXXXXXXXXXXXXXXXXXXXXX&scope=read_write&code=ac_XXXXXXXXXXXXXXXXXX
但在生产中,它正在重定向到基础 url
https://www.fairlywed.com/
没有 Stripe 发送的极其重要的查询参数。这几乎就像我手头上的竞争条件,在 Chrome 或 Firefox 中永远不会触发,但总是在 Safari 中触发。
我也想知道我对 angular-ui-router 的使用或 stripe 指向我的站点的事实是否可能涉及,但 none 这些确实对我来说很有意义。我现在可能只是在抓住救命稻草。
我找到了一个创可贴解决方案,但我仍然不确定为什么会这样。在生产中,req.protocol
以 http
的形式出现,由我的代码的另一部分处理:
function redirectChecker (req, res, next) {
if (env === 'production') {
if (req.headers['x-forwarded-proto'] !== 'https') {
var urlAfterConversion = ['https://', req.get('Host'), req.url].join('');
return res.redirect(urlAfterConversion);
}
}
return next();
};
出于某种原因,在 Safari 上重定向不起作用(也许 Safari 不接受重定向后跟重定向?)
因此失败并重定向到我的目标网页。我仍然不确定为什么它解决了问题,但这段代码有效:
if (stripeConnectVendorId) {
var env = process.env.NODE_ENV || 'development';
var redirectUrl = [req.protocol, '://', req.get('Host'), '/#/account/vendor/details/', stripeConnectVendorId, '?', req.originalUrl.split("?").pop()].join('');
if (env === 'production') {
redirectUrl = 'https:' + redirectUrl.split(':')[1];
}
res.redirect(redirectUrl);
} else {
console.log('There was no vendor id to match the stripe state received');
res.sendStatus(403);
}