Pelican SSG:配置USE_FOLDER_AS_CATEGORY后URL未带目录的问题排查
问题根源
USE_FOLDER_AS_CATEGORY 这个配置仅对文章(Articles)生效,完全不会影响页面(Pages)的 category 字段赋值。你开启这个选项后,页面依然不会自动将所在文件夹识别为 category,所以 PAGE_URL 中的 {category} 变量为空,最终生成的 URL 就缺失了目录部分。
解决方案
要让页面自动继承所在文件夹的路径到 URL 中,需要通过 PATH_METADATA 配置从文件路径中提取目录信息,再结合 Jinja2 条件语法生成动态 URL:
修改你的 pelicanconf.py 为以下内容:
# 从页面文件路径中提取子目录(如果存在)和 slug PATH_METADATA = r'pages/(?:(?P<subdir>[^/]+)/)?(?P<slug>[^/]+)\.md' # 根据是否有子目录生成对应 URL PAGE_URL = '{%- if subdir %}{subdir}/{% endif %}{slug}/' PAGE_SAVE_AS = '{%- if subdir %}{subdir}/{% endif %}{slug}/index.html' PAGE_PATHS = ['pages'] PAGE_TEMPLATE = 'page'
说明
PATH_METADATA用正则表达式捕获:- 根目录下的
about.md:subdir为空,slug为about events文件夹下的conference.md:subdir为events,slug为conference
- 根目录下的
PAGE_URL和PAGE_SAVE_AS通过 Jinja2 的{% if %}条件判断,当存在subdir时就将其加入路径,最终生成你期望的/about和/events/conference两个 URL。
如果你的页面有更深层级的目录(比如 /pages/events/2024/meetup.md),可以调整 PATH_METADATA 的正则来捕获完整子路径:
PATH_METADATA = r'pages/(?P<subpath>.+/)?(?P<slug>[^/]+)\.md' PAGE_URL = '{subpath}{slug}/' PAGE_SAVE_AS = '{subpath}{slug}/index.html'
这样会自动生成 /events/2024/meetup 这类嵌套 URL。
内容的提问来源于stack exchange,提问作者Malvinka
相关产品推荐
相关产品推荐

