3

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

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

我目前正在使用 /etc/map.publish 下的 sling:Mapping 节点将资源路径映射到响应中的短 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

入站和出站 url 存在这种差异的原因是因为我有 Apache 为不同的设备类型重写 URL。

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

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

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

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

似乎映射使用考虑主机/端口来严格解析资源。然后在输出期间映射 url 时,会找到并使用“最佳匹配”。如果可能的话,我希望 map() 的行为类似于 resolve()。

4

2 回答 2

1

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

  1. URL 解析器使用resolver.resolve()负责将 URLhttp://app.company.com/page.html转换为内容路径,例如。/content/company/app/en/page.html
  2. 链接重写器使用resolver.map()转换内容并将所有链接从 、 等形式的形式缩短为/content/company/app/en/page.html完整URL 的方法。仅当您在适当的属性中没有任何正则表达式时,它才会起作用。<a><img>sling:match

您可以使用域名来映射/解析内容,例如。创建多域环境,因此http://app.company.com/page.html会打击一种资源并http://app.company2.com/page.html打击另一种资源。

但是,您不能根据当前请求主机禁用或启用链接重写器。例如。如果如上所述配置映射,则/content/company/app/en/page.html内容路径将始终缩短为http://app.company.com/page.html,无论您的请求中有什么主机标头。

于 2013-09-17T12:41:11.710 回答
1

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

您的映射将如下所示:

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

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

于 2013-09-18T07:55:16.623 回答