嵌套的路由请求被解释为请求CSS文件
甚至不知道如何说这个问题。
基本上我有一个React应用程序,我使用React-Router进行路由处理,节点服务器发送每个请求的index.html文件,并处理静态资产,因为我正在使用React Router的HistoryLocationconfiguration。 logging每个请求到该服务器,我可以看到,去基地url发送3个请求,一切正常工作:
GET / 200 3.795 ms - - GET /static/app.css 200 2.234 ms - - GET /build/bundle.js 200 0.608 ms - -
任何规则的浅层路线也是如此(例如/a
)。 但是,只要我尝试访问一个嵌套的路线(例如/a/b
),一切都打破。 更具体地说,在窗口中,我收到Uncaught SyntaxError: Unexpected token <
一个语法错误,在我的节点服务器的日志中,我得到这些请求:
GET /a/b 304 2.286 ms - - GET /a/static/app.css 304 1.061 ms - - GET /a/build/bundle.js 304 1.004 ms - -
所以这里的行为似乎是每次我发送一个页面视图请求,它发送一个请求给定的嵌套路由,对于任何额外的静态资产,它只是popup嵌套的路由,并追加该静态资产的路由到那个路线的其他部分 所以例如,如果我去/a/b/c
,我会看到像GET /a/b/static/app.css
。
这是我的节点服务器设置:
import express from 'express'; import morgan from 'morgan'; import path from 'path'; const app = express(); const STATIC_PATH = path.join(__dirname, '/../dist'); app.use(morgan('dev')); app.use(express.static(STATIC_PATH)); app.get('*', (req, res) => { res.sendFile('index.html', { root: STATIC_PATH }); }); app.set('port', process.env.PORT || 8000); app.server = app.listen(app.get('port'), () => { console.log('Listening on port %d', app.get('port')); });
看起来,您的网页中可能有静态资源url,就像"static/app.css"
,它是完全相对的url。 当你这样做的时候,浏览器会在当前网页的相同path上请求这个文件名,它会根据当前网页的path而变化。 所以,如果你的网页是/a.html
,它会请求/static/app.css
。 如果你的网页是/a/b.html
,它会请求/a/static/app.css
(这看起来就是你所看到的)。
你可能想要的是以/
开头的静态资源的域相对path,看起来像"/static/app.css"
。 前导斜杠使其仅与域相关,而不与网页path相关。 不pipe网页path是什么,浏览器都会发出相同的请求,因为path是相对于域名的顶部的。
所以,总结一下,HTML文件从这改变了:
<link rel="stylesheet" href="static/app.css">
对此:
<link rel="stylesheet" href="/static/app.css">