Fix 404 for README-based section pages in Express router
Resolve directory README.html paths for nav links like 周易 and 中医宝典. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -26,7 +26,7 @@ export default defineConfig({
|
|||||||
themeConfig: {
|
themeConfig: {
|
||||||
nav: [
|
nav: [
|
||||||
{ text: '首页', link: '/' },
|
{ text: '首页', link: '/' },
|
||||||
{ text: '五行', link: '/金、木、水、火、土%20-%20五行/' },
|
{ text: '五行', link: '/金、木、水、火、土 - 五行/' },
|
||||||
{ text: '道德经', link: '/道德经/01' },
|
{ text: '道德经', link: '/道德经/01' },
|
||||||
{ text: '周易', link: '/周易/' },
|
{ text: '周易', link: '/周易/' },
|
||||||
{ text: '中医', link: '/中医宝典/' },
|
{ text: '中医', link: '/中医宝典/' },
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ hero:
|
|||||||
link: /道德经/01
|
link: /道德经/01
|
||||||
- theme: alt
|
- theme: alt
|
||||||
text: 五行
|
text: 五行
|
||||||
link: /金、木、水、火、土%20-%20五行/
|
link: /金、木、水、火、土 - 五行/
|
||||||
|
|
||||||
features:
|
features:
|
||||||
- title: 道德经
|
- title: 道德经
|
||||||
@@ -30,7 +30,7 @@ features:
|
|||||||
|
|
||||||
## 快速导航
|
## 快速导航
|
||||||
|
|
||||||
- [五行](/金、木、水、火、土%20-%20五行/)
|
- [五行](/金、木、水、火、土 - 五行/)
|
||||||
- [抱朴子](/抱朴子/)
|
- [抱朴子](/抱朴子/)
|
||||||
- [鬼谷子](/鬼谷子/捭阖)
|
- [鬼谷子](/鬼谷子/捭阖)
|
||||||
- [风水](/风水/REAME)
|
- [风水](/风水/REAME)
|
||||||
|
|||||||
+33
-13
@@ -115,27 +115,47 @@ if (!fs.existsSync(distPath)) {
|
|||||||
process.exit(1)
|
process.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
app.use(express.static(distPath, { index: false }))
|
app.use(
|
||||||
|
express.static(distPath, {
|
||||||
|
index: ['index.html', 'README.html'],
|
||||||
|
extensions: ['html'],
|
||||||
|
redirect: true,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
function resolveHtmlPath(urlPath) {
|
||||||
|
const rel = decodeURIComponent(urlPath).replace(/^\//, '').replace(/\/$/, '') || 'index'
|
||||||
|
const candidates = [
|
||||||
|
path.join(distPath, `${rel}.html`),
|
||||||
|
path.join(distPath, rel, 'index.html'),
|
||||||
|
path.join(distPath, rel, 'README.html'),
|
||||||
|
]
|
||||||
|
|
||||||
|
for (const candidate of candidates) {
|
||||||
|
if (fs.existsSync(candidate)) {
|
||||||
|
return candidate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
app.get('*', (req, res, next) => {
|
app.get('*', (req, res, next) => {
|
||||||
if (req.path.includes('.')) {
|
if (req.path.includes('.')) {
|
||||||
return next()
|
return next()
|
||||||
}
|
}
|
||||||
|
|
||||||
const rel = req.path.replace(/^\//, '').replace(/\/$/, '') || 'index'
|
const htmlPath = resolveHtmlPath(req.path)
|
||||||
const candidates = [
|
if (htmlPath) {
|
||||||
path.join(distPath, `${rel}.html`),
|
return res.sendFile(htmlPath)
|
||||||
path.join(distPath, rel, 'index.html'),
|
|
||||||
path.join(distPath, '404.html'),
|
|
||||||
]
|
|
||||||
|
|
||||||
for (const candidate of candidates) {
|
|
||||||
if (fs.existsSync(candidate)) {
|
|
||||||
return res.sendFile(candidate)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return next()
|
const notFound = path.join(distPath, '404.html')
|
||||||
|
if (fs.existsSync(notFound)) {
|
||||||
|
return res.status(404).sendFile(notFound)
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.status(404).send('Not Found')
|
||||||
})
|
})
|
||||||
|
|
||||||
app.listen(PORT, '0.0.0.0', () => {
|
app.listen(PORT, '0.0.0.0', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user