Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Express 从post请求重定向到新页面(服务器端)_Express_Http_Redirect - Fatal编程技术网

Express 从post请求重定向到新页面(服务器端)

Express 从post请求重定向到新页面(服务器端),express,http,redirect,Express,Http,Redirect,我在${host}/api/graphql上有一个可通过POST访问的快速graphql端点 在这个路由上,我有身份验证中间件,如果用户没有登录,我想重定向到登录页面 看起来有点像这样 const authCheck = (req, res, next) => { const referringUrl = req.get('referer'); try { const token = req.cookies.Auth; jwt.verify(token, pr

我在
${host}/api/graphql
上有一个可通过POST访问的快速graphql端点

在这个路由上,我有身份验证中间件,如果用户没有登录,我想重定向到登录页面

看起来有点像这样

const authCheck = (req, res, next) => {

  const referringUrl = req.get('referer');

  try {
    const token = req.cookies.Auth;

    jwt.verify(token, process.env.AUTH_PRIVATE_KEY);

    next();
  } catch(err) {
    res.redirect(302, `/login?redirect=${referringUrl}`);
  }
}
起初,我将其作为响应状态代码307,它在GET请求上运行良好。浏览器按预期将页面更改为
引用URL

但是对于Post请求,使用状态307导致浏览器重定向使用Post方法。很好,所以我换成了302。现在,它发送一个get请求,但实际上并不更改浏览器中的url

如何从服务器端完成此功能


提前感谢。

Post代码后的重定向通常是
303
(请参见其他),这应该避免重复使用您在
307
中使用的Post方法

奇怪的是303和302几乎是一样的,接收到这种重定向的浏览器应该跟随它并改变浏览器的位置。因此,您当前的代码应该已经可以工作了

你说
现在它发送一个get请求,但实际上没有改变浏览器中的url
,所以我想你可能在谈论Ajax调用?如果帖子是通过XhmlHttpRequest发布的,那么问题不仅仅在于服务器端。它是关于在Ajax调用中处理重定向的。然后你就有了几条可以走的路。您可以在堆栈溢出上搜索“重定向”和“ajax”,并找到一些建议。例如,您可以构建自己的应用程序级协议,不发送HTTP重定向,而是在json响应中发送应用程序重定向,并让js客户机理解并更改位置,或者其他一些东西。那是一个被广泛讨论的话题


顺便说一句,在安全性/健壮性方面,您可能需要做一些调整,比如在redirect()调用中使用的位置上使用
encodeURI
,或者检查
referer
是否来自您真正处理的域(或者仅在登录页面的
redirect
参数上强制执行相关URL)正如@regilero所说,问题出在客户端。您的GraphQl服务器无法在浏览器中更改url,因为js代码发出请求,而不是浏览器

您可以捕获30*错误状态,并在客户端代码上手动重定向

如果您使用Apollo Client for graphQl,则可以遵循本指南