【问题标题】:Node.js: Redirect and send page at onceNode.js:一次重定向和发送页面
【发布时间】:2014-08-07 21:56:54
【问题描述】:

我正在尝试为 Node.js 中的 HTML 页面构建简单的服务器。我的问题是,当我导航到(例如)http://localhost:8080/someDirectory 时,浏览器认为 someDirectory 是文件(实际上,它被重定向到 someDirectory/index.html)。

所以当我使用<script src="./script.js"></script> 时,它会尝试使用http://localhost:8080/script.js,而不是http://localhost:8080/someDirectory/script.js

我能想到的唯一解决方案是将浏览器重定向到/someDirectory/(末尾带有斜杠)。然后,浏览器正确地理解它是目录而不是文件。

我的问题是,我不想让我的服务器变慢,因为双重请求(客户端被重定向,发送另一个请求,然后最终获得网页)。是否可以发送发送页面并通知浏览器更改,而不是使用 302 标头进行重定向?


编辑:当我访问在 Apache 服务器上运行的某个页面时,当我输入 http://localhost/someDirectory 时,尾部斜杠会自动附加。我只是好奇它是如何完成的(没有额外的 PHP 或 javascript)。

【问题讨论】:

  • 使用 express.js 处理服务 html
  • 那些只是拼写错误,还是您实际上使用的是http:/...而不是http://

标签: javascript node.js url redirect


【解决方案1】:

不,这是不可能的,甚至不是正确的解决方案。您当然可以通过重定向发送内容,但这毫无意义,因为浏览器不会显示它......它会立即跟随重定向。

如果你想要/someDirectory/,那与/someDirectory 不同。您必须重定向。

【讨论】:

    【解决方案2】:

    我推荐使用history.replaceState (MDN)。这适用于大多数现代浏览器(大多数用户),但不适用于旧浏览器。由于较旧的浏览器正在减少,随着时间的推移它应该不再是一个问题。这应该可以解决问题 - 您需要将其直接粘贴到 HTML 标记中才能正常工作:

    if ( !window.location.pathname.match(/\/$/) ) {
        if ( window.history && window.history.replaceState ) {
            window.history.replaceState(null, null, window.location.pathname + '/');
            document.write('<script src="./script.js"></script>');
        } else
            window.location.replace( window.location.pathname + '/');
    } else {
        document.write('<script src="./script.js"></script>');
    }
    

    【讨论】:

    • 出于 SEO 原因,我不建议这样做。您必须为两个 URL 提供相同的内容。另外,你还有很多兼容性问题。\
    • 服务器应该已经为任一 URL 提供相同的内容,“canonical”标签将解决任何重复问题,“最糟糕”的兼容性问题是旧浏览器将执行重定向。如果网站上的所有超链接 URL 由于某种原因没有以斜线结尾,那么您将重定向减少了近 50%……这对 SEO 有好处,而对服务器来说工作量更少。
    • 我强烈反对。服务器应该为任一 URL 提供相同的内容(当然,除非这是您的意图,这不是标准行为)。除非您让用户键入 URL,否则这些重定向真的不需要发生。如果您首先链接到正确的内容,那么这对速度来说不是问题。
    • 尾随斜杠一直是您根据[主要]偏好实现的那些可选(通常可配置)的东西之一。不管你喜不喜欢,大多数服务器默认情况下都没有实现“严格”的 URL 路径……提供相同的内容,不管尾随斜杠如何。我刚刚测试了 Apache、IIS 和 node (express)...
    • 对,所有这些服务器的作用是什么? 302重定向。
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2019-10-29
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多