背景:我的任务是为在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:)
答案 0 :(得分:3)
Sling是一个基于资源的框架,因此您必须在JCR中拥有一个您的请求所针对的资源(节点)。
您有两种选择: 1)创建一个站点地图模板,其中包含显示站点地图的逻辑,或者包含站点地图组件。 Sitemap逻辑可以根据需要提取到类或服务中。每个站点的站点地图将位于: - /content/us/en/sitemap.xml - /content/ca/fr/sitemap.xml
2)使用2个吊索选择器创建您引用的单个站点地图资源(节点);国家/地区和语言代码 - 此方法允许缓存,但您可能会将缓存清除问题作为单个资源运行。
您可以查看:PathInfo,用于提取Sling Selector信息,以确定要呈现的Sitemap。
http://dev.day.com/docs/en/cq/current/javadoc/com/day/cq/commons/PathInfo.html
如果我这样做,我需要手动将Sitemap添加到每个网站,并将资源保留在/ content //
下您甚至可以考虑使用MSM创建Blueprint网站(如果您使用的是我认为您的平台),并使用可以创建网站模板的网站推出新网站。
答案 1 :(得分:2)
如果您希望自定义代码处理GET到/{country}/{localization}/sitemap.xml,只需在该位置创建一个节点并根据需要设置其吊索:resourceType以调用自定义servlet或脚本
要自动创建这些sitemap.xml节点,您可以使用JCR观察者在创建新的/ {country} / {localization}树时收到通知,然后创建sitemap.xml节点。
对于可配置的站点地图,您可以向sitemap.xml节点添加属性,并让您的自定义servlet或脚本使用其值来调整其输出。
您可以使用servlet过滤器或自定义ResourceProvider在存储库中没有sitemap.xml节点的情况下执行此操作,但是使用这些节点可以使实现和理解更加容易。
答案 2 :(得分:1)
注意我正在开发一个sling资源合并,它是一个自定义资源提供程序,能够根据您的搜索路径合并多个资源。
例如,如果您的搜索路径是 /应用 /库
点击/ virtual / my / resource / is / here将会检查 /应用/我/资源/是/在这里 /库/我/资源/是/这里
有一些选项,如:
我打算尽快提交这个补丁。
代码目前位于https://github.com/gknob/sling-resourcemerger,并由https://issues.apache.org/jira/browse/SLING-2986
跟踪