【发布时间】:2017-03-07 13:06:54
【问题描述】:
我在下面的代码中使用 express 路由器。
第一个定义接受 localhost:3000/tests 是正确的。 第一个定义也接受 localhost:3000/tests/ 这似乎不正确。
当这里接受第二个 URL 时,它会导致我生成的 HTML 具有不正确的相对 URL(例如,当第二个 URL 被接受时变为 /tests/hello 而不是所需的 /hello)。为什么会这样?我应该做些什么来防止带有斜杠的 URL 匹配吗?如果它必须接受两者,我如何生成在这两种情况下都是正确的相对 URL?
//tests.js:
const router = express.Router();
// accepts /tests AND /tests/
router.get('/', function(req, res, next) {
});
// accepts /tests/new AND /tests/new/
router.get('/new', function(req, res, next) {
});
//app.js
var tests = require('./routes/tests');
app.use('/tests', tests);
我看到的所有 node.js 示例代码都使用“/”和“/foo”之类的路由,所以我不确定我哪里出错了。
附加编辑:
在创建相对 URL 时,它会构建传入 URL。因此,如果路由处理程序同时接受 /tests 和 /tests/ ,则构建的所有相对 URL 将解析为不同的路径,因为最后一个斜杠对具体路径的形成有很大影响。我应该补充一点,在我部署的环境中,这个应用程序是由 apache 使用代理转发的,因此节点页面的完整 URL 具有类似 example.com/myapp/tests 的上下文。我的开发环境中的路径会有所不同(例如 localhost:3000/tests)
我在几个地方使用相对 URL。
在路由处理程序中,我可能会执行 res.redirect("foo")。所以如果 传入的 URL 是 example.com/myapp/tests/ 这将导致重定向到 URL example.com/myapp/tests/foo,但如果传入的 URL 是 example.com/myapp/tests 这将导致重定向到示例。 com/myapp/foo。我想要的是第二个,而不是第一个。
-
在我生成(使用 EJS 渲染)的 HTML 页面中,包含 CSS 和 HTML 表单、链接、按钮。因此,如果传入的 URL 有尾部斜杠,则类似这样的 CSS 包含的内容解析不正确
link href = "stylesheets/my.css" rel = "stylesheet">
这些东西的路径都是相对于当前页面的。但是,如果浏览器的位置框将该页面显示为 example.com/myapp/tests/ 我得到的 URL 与 example.com/myapp/tests 不同。在前一种情况下,找不到 CSS,因为它在 /tests/stylessheets/my.css 而不是 /stylesheets/my.css 中寻找它。同样,其他相对 URL 的解析方式也不同,因为可以使用两个不同的传入 URL 有效地生成此页面。
【问题讨论】:
-
我在整个应用程序中使用诸如
/tests/hello之类的绝对路径没有任何问题,为什么需要相对路径?你能说明你在哪里有相对路径的问题吗?