背景:我的任务是为在 Sling 上运行的网站实现搜索引擎站点地图。该网站具有多个特定于国家/地区的网站,并且每个特定于国家/地区的网站可以有多个本地化 - 例如,http://ca.example.com/fr将是加拿大网站的法语本地化版本,并将映射到/content/ca/fr 。我无法更改此内容结构,不幸的是,国家/地区和本地化节点都具有相同的 sling:resourceType
。此外,管理类型需要每个国家/地区/本地化对的 sitemap.xml,而不是每个国家网站一个。
生成站点地图是一项简单的任务,我的问题是每个国家/本地化对都需要一个“站点地图”节点 - 由于添加国家和本地化节点的方式(并且它们具有相同的资源类型),我不能目前想到一个很好的自动化方法来添加站点地图节点。
如果我能以某种方式定义一个“虚拟资源”,将/{country}/{localization}/sitemap.xml 的请求映射到处理脚本,那就太好了;我一直在浏览并遇到了 ResourceProvider
和 OptingServlet
,但它们似乎非常关注绝对路径 - 或者向现有资源添加选择器,这并不'对我来说这似乎是一个选择。
如果有一些或多或少干净的方法来处理这个问题,有什么想法吗?添加新的国家/地区/本地化并不是每天都会发生,但手动添加“站点地图”节点仍然不是最佳解决方案。
我一直在考虑,拥有一个每天更新站点地图 X 次的运行服务,并在 JCR 中生成 sitemap.xml 节点作为简单文件资源,而不是涉及 Sling 解析器,这是否是一个更好的主意。 ..但在走这条路之前,我想要一些反馈:)
编辑:
结果要求发生了变化,他们现在希望站点地图可以根据本地化进行配置 - 让我的工作更轻松,而且我不必与 Sling 对抗:)
最佳答案
Sling 是一个基于资源的框架,因此您必须在 JCR 中拥有您的请求所针对的资源(节点)。
您有两个选择: 1) 创建一个 Sitemap 模板,其中包含显示 Sitemap 的逻辑,或者包含您的 Sitemap 组件。站点地图逻辑可以根据您的需要提取到类或服务中。每个站点的站点地图位于: -/content/us/en/sitemap.xml -/content/ca/fr/sitemap.xml
2) 创建使用 2 个吊索选择器引用的单个站点地图资源(节点);国家和语言代码 - 此方法允许缓存,但是作为单一资源,您可能会遇到缓存清除问题。
- /content/sitemap.us.en.xml
- /content/sitemap.ca.fr.xml
您可以查看:PathInfo,用于提取 Sling Selector 信息以确定要渲染的站点地图。
http://dev.day.com/docs/en/cq/current/javadoc/com/day/cq/commons/PathInfo.html
如果我这样做,我需要手动将站点地图添加到每个站点,并将资源保留在/content//下
您甚至可以考虑使用 MSM 创建蓝图网站(如果您使用的是我认为您使用的平台),并使用可让您创建网站模板的平台推出新网站。
关于java - Sling 可以处理 "virtual resources"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6652221/