【问题标题】:Cannot serve static files with express routing and no trailing slash无法提供具有快速路由且没有尾部斜杠的静态文件
【发布时间】:2012-06-07 16:26:13
【问题描述】:

我想要一个名为“main”的路由,它将为静态文件提供服务:

app.use('/main',express.static(__dirname+'/public'));

但是当我这样做时:

http://my.site.dev/main

无法下载 CSS 和 JS 文件,因为它试图从中获取它们

http://my.site.dev/css/styles.css

它应该从以下位置获取文件:

http://my.site.dev/main/css/styles.css

但是,如果我使用尾部斜杠访问我的网站:

http://my.site.dev/main/

所有文件都顺利通过

有什么想法为什么没有尾部斜杠会导致 CSS 和 JS 等资源无法进入?

【问题讨论】:

    标签: node.js express routes


    【解决方案1】:

    这是一个 http 问题,而不仅仅是与 Express 相关的挑战。该问题在以下位置讨论:

    如果您的 URL 是 /main 并且您的相对 URL 是 css/style.css,它将解析为 /css/style.css;但如果您的 URL 是 /main/,则相对 URL 会解析为 /main/css/style.css。

    我处理这个问题的策略是重定向以添加尾部斜杠。在 Express 中是这样的:

    app.all(/^\/main$/, function(req, res) { res.redirect('/main/'); });
    app.use('/main/',express.static(__dirname+'/public'));
    

    或者:

    app.enable('strict routing');
    app.all('/main', function(req, res) { res.redirect('/main/'); });
    app.use('/main/',express.static(__dirname+'/public'));
    

    【讨论】:

    • 要将所有不带 / 的路由重定向到带有 / 的相同 url,你可以使用:app.use(/.*[^\/]$/, function (req, res, next) { res.redirect(req.originalUrl+'/'); });正则表达式/.*[^\/]$/ 将匹配所有没有尾随的网址/ PS:如果有人可以修复我的标记,请做。我不知道为什么我的代码不在代码块中
    • 我对@kel 的评论不满意。它最终产生了一条有效的路线和一条无效的路线,这与工作路线相同,加上所有静态内容的尾部斜杠。然而,特雷弗的回答似乎奏效了。
    【解决方案2】:

    如何在 HTML 中请求 JS/CSS 文件?如果您使用像css/styles.css 这样的字符串,那么它将尝试从当前目录中获取它们。 /main 的目录是/(就像/main.html 一样),而/main/ 的目录是/main/。一个快速的解决方法是在您的 HTML 中使用 /main/css/styles.css

    【讨论】:

    • 我正在使用: 在链接href中使用完整路径没有意义
    • 就我个人而言,我总是对资产使用完整路径,因为我从不使用file:// 协议进行调试。无论如何,您在这里只能使用几个选项:(1) 使用资产的完整路径; (2)在Express中使用中间件或其他东西来确保尾部斜杠始终存在; (3) 在渲染时使用 local 来告诉布局使用哪个路径,例如在 Jade link(href="#{subdir}/css/styles.css") (4) 在 HTML 中使用 <base href /> 手动设置基本 URI(似乎是最糟糕的解决方案)。
    • 我没有使用 file:// 协议,我的网站在本地托管在 my.site.dev/main
    • 如果是这样,为什么使用完整路径没有意义?如果使用相对路径,每个子路径都会得到不同的结果(例如,/main/main/something/main/something/else 的相对路径都是不同的)。
    • 在 apache 中,您可以在 conf 文件中提供一个别名,将主 url 的路径指向文件系统中的目录。您不需要在脚本中提及别名路径名,因为 root 始终指向该目录。我想要在 node.js/connect/express 中使用非尾随斜杠的相同功能。我认为这是一些正则表达式,或者我需要将 main 重定向到 main/ ?
    猜你喜欢
    • 2019-01-03
    • 2017-08-16
    • 2023-04-08
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2020-07-07
    相关资源
    最近更新 更多