可以将Sling映射限制为具有主机头的请求

时间:2013-09-17 09:16:21

标签: url-rewriting cq5 sling

我想有选择地应用在sling中定义的Sling mappings:映射/etc/map.publish下的节点,并且无法获得我想要的行为。

基本上,我希望映射规则仅在主机标头匹配请求时触发。

我目前正在使用sling:映射/etc/map.publish下的节点,以将资源路径映射到响应中的短URL。

所以在/etc/map.publish/http/myapp下我会有以下节点:

<jcr:root ...>
    jcr:primaryType="sling:Mapping"
    sling:internalRedirect="/content/company/app/en"
    sling:match="app.company.com
</jcr:root>

我想要的是当用户请求时:

http://app.company.com/content/company/app/en/page.html

响应中的URL(映射时)将以以下形式返回:

http://app.company.com/page.html

入站和出站网址存在差异的原因是因为我为不同的设备类型重写了Apache。

但是,当具有不同主机头的请求到达时,例如:

http://localhost:4502/content/company/app/en/page.html

我不希望根据该规则映射URL。现在,它正被映射到

http://app.company.com/page.html

似乎映射严格地使用考虑主机/端口来解析资源。然后,在输出期间映射URL时,找到并使用“最佳匹配”。我希望map()尽可能像resolve()一样。

2 个答案:

答案 0 :(得分:1)

有两种基于/etc/map的机制:

  1. 使用resolver.resolve()负责将http://app.company.com/page.html等网址转换为内容路径的网址解析器,例如。 /content/company/app/en/page.html
  2. 使用resolver.map()方法链接重写器,该方法可转换内容并缩短/content/company/app/en/page.html<a><img>表单中的所有链接到完整网址。只有在适当的sling:match属性中没有任何正则表达式时,它才会起作用。
  3. 您可以使用域名来映射/解析内容,例如。创建multidomain environment,因此http://app.company.com/page.html会点击一个资源,http://app.company2.com/page.html会点击另一个资源。

    但是,您无法根据当前请求主机禁用或启用链接重写器。例如。如果按上述方式配置映射,/content/company/app/en/page.html内容路径将始终缩短为http://app.company.com/page.html,无论您的请求中包含哪个主机标头。

答案 1 :(得分:1)

如果您想确保您的入站请求已解决,只需添加第二个映射即可。

您的映射将如下所示:

<jcr:root ...>
    jcr:primaryType="sling:Mapping"
    sling:internalRedirect="[/content/company/app/en,/content,/]"
    sling:match="app.company.com
</jcr:root>

出站映射,s.a。 resolver.map()将使用第一个应用规则。