【问题标题】:Why doesn't express redirect properly when I edit the status code为什么在我编辑状态码时无法正确表达重定向
【发布时间】:2014-02-26 10:49:47
【问题描述】:

标准res.redirect('/some/path'); 的行为符合预期并立即将请求重定向到/some/path,但如果我添加状态代码,例如res.redirect(401, '/some/path') 并导航到重定向页面,express 不会重定向到/some/path,我只得到以下页面:

<p>Unauthorized. Redirecting to <a href="/some/path">/</a></p>

它永远不会重定向。这对于我提供的任何状态码都是一样的。

为什么代码指定的重定向没有像我预期的那样工作,我如何返回自定义状态代码并重定向到不同的路径?

【问题讨论】:

    标签: node.js http express


    【解决方案1】:

    Location 标头的行为,用于重定向某人,仅针对 3xx 范围内的状态代码和 201/202 状态定义。由于您将状态代码设置为 401,因此它会忽略标头并仅呈现响应内容。碰巧 Express 包含一些很好的文本,说明用户正在被重定向,以防重定向缓慢。

    此外,鉴于401 状态码的定义,您可能会误用它。 401 代码是为了让客户端知道它需要通过给定请求发送额外的身份验证信息,例如http://en.wikipedia.org/wiki/Basic_access_authentication,所以你不应该重定向到另一个 URL。

    【讨论】:

    • 我想发送代码“401”并告诉客户端将用户重定向到登录页面。我将如何使用 Angular 一步完成(不滥用 401)?目前我的解决方法是使用 302。
    • 401 响应码用于 HTTP 基本身份验证,在浏览器中显示一个弹出框,因此除了浏览器之外没有其他登录表单。如果您正在实现自己的登录表单,则不应使用401。注意the HTTP/1.1 code specsThe response MUST include a WWW-Authenticate header field (section 14.47) containing a challenge applicable to the requested resource.中的描述
    • 感谢您的回答。但是,我不确定在以下情况下该怎么做。我在仅限 http 的 cookie 中有一个 JWT 令牌。假设用户没有登录,并且正在尝试访问/account。在这种情况下,在我的代码中,我检查req.cookies 上是否有 JWT 令牌,如果没有令牌,我只需 res.redirect('/log-in')。它可以工作,但是我认为它不正确,因为在正常情况下状态码应该是 401。我的问题是在这种情况下该怎么办?非常感谢您的宝贵时间。
    • 如果您将 JWT 发送到 API,我希望 401 成为状态代码,但如果您正在重定向,那么情况似乎并非如此,因此重定向很重要声明您正在返回,而不是这个 3xx 代码更有意义。如果您有更多想法,请提出官方 SO 问题,但 cmets 不适合进行此讨论。
    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 2014-07-02
    • 2020-07-15
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多