AEM:Dispatcher配置与Sling内部重定向冲突问题求助
解决Dispatcher Apache重定向与Sling内部重定向的冲突问题
我之前也碰到过类似Dispatcher和Sling重定向“打架”的情况,结合你的场景给你几个实用的排查和解决思路:
先明确你的需求类型
首先得搞清楚你要的是外部重定向(浏览器URL会变成/1.html)还是内部转发(URL保持不变,但内容渲染/1.html的),这俩的配置逻辑完全不一样,搞混了就容易出问题:
- 你现在Apache里加的
R=301是外部重定向,会直接告诉浏览器跳转到新URL - Sling的
sling:internalRedirect是内部转发,请求不会回到浏览器,而是在Sling内部直接转发到目标路径
排查Apache/Dispatcher重定向规则不生效的原因
如果你的目标是外部重定向,但规则没起作用,大概率是这几个问题:
- RewriteEngine没开启:检查你的虚拟主机配置里有没有加
RewriteEngine On,没开的话所有RewriteRule都是摆设 - 规则顺序错了:如果Dispatcher的转发规则(比如把请求转给Sling的规则)放在了重定向规则前面,那请求会直接被转发到Sling,重定向规则根本没机会执行。正确的顺序应该是先处理重定向,再转发:
RewriteEngine On # 先处理重定向规则 RewriteRule ^/content/abc/(.*)$ /$1 [NE,L,R=301] RewriteRule ^/content/def/(.*)$ /$1 [NE,L,R=301] # 再处理Dispatcher转发 RewriteRule ^/(.*)$ /dispatcher/$1 [PT,L] - Dispatcher缓存拦截:Dispatcher会缓存301响应,哪怕你改了规则,旧缓存还在的话浏览器还是会跳旧路径。赶紧去Dispatcher的缓存目录里删掉
/content/abc/和/content/def/相关的缓存文件,然后重启Apache - 浏览器缓存:301是永久重定向,浏览器会自己缓存这个跳转关系,测试的时候一定要用隐私模式,或者手动清除浏览器缓存
调整Sling内部重定向的正确姿势
如果你的目标是内部转发(URL不变),那得确保Sling的重定向规则配置正确,并且没被Dispatcher干扰:
- 节点级重定向:在
/content/abc和/content/def节点上添加配置:- 节点类型设为
sling:Redirect - 添加属性
sling:internalRedirect,值设为/$1(注意这里的正则匹配要对应路径结构) - 确保节点的
jcr:primaryType是sling:Redirect,而不是普通的页面节点
- 节点类型设为
- 全局OSGi规则:如果节点级的不生效,可以用Sling Redirect Handler的OSGi配置,优先级更高:
新建一个OSGi配置,类型为org.apache.sling.engine.impl.redirect.RedirectRule,配置参数:pattern:^/content/(abc|def)/(.*)$target:/$2internal:true
- 清除Sling和Dispatcher缓存:Sling的资源缓存也要清,同时Dispatcher的缓存也要删掉,不然旧的页面内容还会被渲染
关键:避免同时配置两种重定向
不要同时在Apache和Sling里配置针对同一路径的重定向,不然会出现冲突:
- 如果开了Apache的外部重定向,就把Sling的内部重定向关掉,不然请求可能还没到Apache的重定向规则就被Sling内部转发了
- 如果用Sling的内部转发,就确保Apache里没有针对这些路径的重定向规则,避免请求被提前跳走
内容的提问来源于stack exchange,提问作者user3261177
相关产品推荐
相关产品推荐

