无法提供具有快速路由且没有尾部斜杠的静态文件

Posted

技术标签:

【中文标题】无法提供具有快速路由且没有尾部斜杠的静态文件【英文标题】: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 等资源无法进入?

【问题讨论】:

【参考方案1】:

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

Relative URLs and trailing slashes http://www.bizcoder.com/the-mystery-of-the-trailing-slash-and-the-relative-url

如果您的 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/ ?

以上是关于无法提供具有快速路由且没有尾部斜杠的静态文件的主要内容,如果未能解决你的问题,请参考以下文章

允许没有参数的 Symfony2 路由的尾部斜杠?

使用 ASP.NET 路由来提供静态文件

Django---路由配置和静态文件简介

Django之连接Mysql

如何在 codeigniter 中路由请求,以便我们可以提供静态 css、js 和 img 文件?

Apache伪静态在网站目录没有反斜杠后自动添加反斜杠