我的目录结构是这样的
root
private
js
css
index.html
app.js
privateRouter.js
...
在我的index.html中,我使用相对路径来引用js和css文件,像这样。
<link rel="stylesheet" href="css/index.css"/>
<script src="js/index.js"></script>
在服务器端,我有一个私有的路由器 在提供这些文件之前,会检查认证。
在app. js:
app.use("/private", privateRouter);
in privateRouter.js:
router.use((req, res, next) => {
isAuthenticated(req) ? next() : res.redirect("/");
});
router.get('/', function(req, res, next) {
res.sendFile(require('path').join(__dirname + "/private/index.html"));
});
所以现在如果我访问 http://mywebsite.com/private
我将得到index.html,但从浏览器请求jscss文件时,服务器返回的是 http://mywebsite.com/js
而不是 http://mywebsite.com/private/js
因此返回文件未找到。
或者,如果我静态地提供文件,浏览器就知道要从 /private/js
:
app.use("/private", express.static(path.join(__dirname, 'private')));
但我不能静态服务器,因为我需要验证特定的文件,而不是公开提供所有文件。而且我不想在服务器上添加 private/
在客户端的所有文件引用之前。我不明白为什么当静态服务时,服务器知道要使用 /private
作为root,但当使用路由器时,它使用的是 /
为root。
我如何才能保持网址为 http://mywebsite.com/private
而不必附加 private/
在客户端的所有文件引用中?
我是express.js的新手,我也很难表述这个问题。我想我对express.js的工作原理有一些根本性的误解。谢谢大家的帮助!
你可以使用中间件修改请求的URL,用于内部路由。
app.use((req,res,next)=>{
req.url = "/private" + req.url; // prepend "/private" to the url
next();
});
你也可以使用 基础 标签,这意味着你只需要在每个页面上指定一次基本URL。
<html>
<head>
<base href="private">
<link rel="stylesheet" href="css/index.css"/>
<script src="js/index.js"></script>
</head>
</html>
这样就可以将请求发送到
privatecssindex.css
私有jsindex.js,但你仍然需要代码来处理这些路径,否则,你仍然会得到404没有找到的错误。
然而,你仍然需要代码来处理这些路径,否则,你仍然会得到404 not found错误。