我想有选择地应用在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()一样。
答案 0 :(得分:1)
有两种基于/etc/map
的机制:
resolver.resolve()
负责将http://app.company.com/page.html
等网址转换为内容路径的网址解析器,例如。 /content/company/app/en/page.html
resolver.map()
方法链接重写器,该方法可转换内容并缩短/content/company/app/en/page.html
,<a>
等<img>
表单中的所有链接到完整网址。只有在适当的sling:match
属性中没有任何正则表达式时,它才会起作用。您可以使用域名来映射/解析内容,例如。创建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()将使用第一个应用规则。