0

背景:我的任务是为在 Sling 上运行的网站实施搜索引擎站点地图。该站点有多个特定于国家/地区的站点,并且每个特定于国家/地区的站点都可以具有多个本地化版本-例如,http://ca.example.com/fr将是加拿大站点的法语本地化版本,并且将映射到/内容/ca/fr。我无法更改此内容结构,不幸的是,国家和本地化节点都具有相同的sling:resourceType. 此外,管理类型需要一个 sitemap.xml 用于每个国家/地区/本地化对,而不是每个国家站点一个。

生成站点地图是一项简单的任务,我的问题是每个国家/地区/本地化对都需要一个“站点地图”节点 - 由于国家和本地化节点的添加方式(并且它们具有相同的资源类型),我目前无法想到添加站点地图节点的一种很好的自动化方法。

如果我能以某种方式定义一个“虚拟资源”,它将 /{country}/{localization}/sitemap.xml 的请求映射到处理脚本,那就太好了;我一直在浏览并遇到ResourceProviderand OptingServlet,但它们似乎非常专注于绝对路径 - 或者将选择器添加到现有资源中,这对我来说似乎不是一个选项。

如果有一些或多或少干净的方法来处理这个问题有什么想法吗?并非每天都添加新的国家/地区/本地化,但必须手动添加“站点地图”节点仍然不是最佳解决方案。

我一直在考虑是否有一个正在运行的服务每天更新站点地图 X 次,并将 sitemap.xml 节点生成为 JCR 中的简单文件资源,而不是涉及 Sling 解析器是否是一个更好的主意......但是在走那条路线之前,我想要一些反馈:)

编辑:

结果发现需求发生了变化,他们现在希望站点地图可以根据本地化进行配置——让我的工作更轻松,而且我不必与 Sling 对抗 :)

4

3 回答 3

3

Sling 是一个基于资源的框架,因此您必须在 JCR 中有一个资源(节点)作为您的请求目标。

您有两个选择: 1) 创建一个站点地图模板,其中包含显示站点地图的逻辑,或者包含您的站点地图组件。您可以将站点地图逻辑提取到您认为合适的类或服务中。每个站点的站点地图将位于: - /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 创建蓝图站点(如果您使用的是我认为您是的平台)并使用可让您创建站点模板的新站点推出新站点。

于 2011-07-11T21:21:45.313 回答
2

如果您希望 /{country}/{localization}/sitemap.xml 的 GET 由自定义代码处理,只需在该位置创建一个节点并根据需要设置其 sling:resourceType 以调用自定义 servlet 或脚本。

要自动创建这些 sitemap.xml 节点,您可以使用 JCR 观察者在创建新的 /{country}/{localization} 树时收到通知,然后创建 sitemap.xml 节点。

对于可配置的站点地图,您可以将属性添加到 sitemap.xml 节点,并让您的自定义 servlet 或脚本使用它们的值来塑造其输出。

您可以在存储库中没有 sitemap.xml 节点的情况下使用 servlet 过滤器或自定义 ResourceProvider 来做到这一点,但是拥有这些节点会使事情更容易实现和理解。

于 2011-07-13T09:32:11.530 回答
1

注意我正在开发一个 sling 资源合并,它是一个自定义资源提供程序,能够根据您的搜索路径合并多个资源。

例如,如果您的搜索路径是 /apps /libs

点击 /virtual/my/resource/is/here 将检查 /apps/my/resource/is/here /libs/my/resource/is/here

有一些选项,例如:

  • 添加/覆盖属性
  • 删除 /libs 下资源的一个属性
  • 如果可用,重新排序节点

我打算尽快提交这个补丁。

代码当前位于https://github.com/gknob/sling-resourcemerger并由https://issues.apache.org/jira/browse/SLING-2986跟踪

于 2013-07-30T10:23:44.897 回答