AEM Apache Dispatcher 2.4.6 客户端被服务器配置拒绝

AEM Apache Dispatcher 2.4.6 client denied by server configuration

我在版本为 2.4.6 的 Apache 实例后面有一个 AEM 6.3 实例 运行,其中包含 Dispatcher 模块。一切都很好,但现在我需要清除所有以“.html”结尾的 URL 的所有查询参数。

这听起来很容易完成,但我遇到了一个我无法解决的问题。这是我用来从以 .html:

结尾的 URLs 中删除所有查询参数的重写规则
RewriteRule ^/(.*)\.html$ /.html [QSD]

从技术上讲,可以将此重写视为实际上不是重写,因为它将原始请求发送到同一个 URL,但标志 QSD 用于删除所有查询参数。

问题是,如果我重新加载包含此规则的 Apache 实例,我将开始收到如下错误:

[Wed Jun 10 14:53:35.698908 2020] [authz_core:error] [pid 31733] [client 54.209.162.6:61649] AH01630: client denied by server configuration: /etc/clientlibs, referer: https://my.domain.com/etc/clientlibs/mygroup/some/simple/page.html

我知道有些人在从 Apache 2.2 迁移到 2.4 时遇到过这样的问题。这不是我的情况,我也检查了我的虚拟主机配置。我没有来自 Apache 2.2 的指令,例如 "Order deny,allow" 或 "Allow from all"。我正在使用 "Require all granted".

AEM 日志中的一件奇怪的事情是,当我的重写规则未到位时,我可以看到 error.log 记录发现“/etc/clientlibs/mygroup/some/simple/page.html”。但是如果我放置规则并重新加载 Apache,我会从日志中看到:

10.06.2020 10:16:40.085 *INFO* [54.209.162.6 [1591798600081] GET /etc/clientlibs/mygroup/some/simple/page/jcr:content.json HTTP/1.1] org.apache.sling.engine.impl.SlingRequestProcessorImpl service: Resource /etc/clientlibs/mygroup/some/simple/page/jcr:content.json not found

这就像扩展名 .html 会从 URL 中剥离,并且由于没有扩展名,AEM 或更确切地说 Sling 正在尝试使用默认的内容解析器 JSON.

在重写规则之前添加一个条件以跳过要应用于 /etc/clientlibs 的此规则怎么样。 RewriteCond %{REQUEST_URI} !^/etc/clientlibs.*

你为什么不直接使用

RewriteRule ^ %{REQUEST_URI} [L,R,QSD]

(也许在您的情况下不需要重定向...但它让浏览器清楚)。

或者,如果您只是想确保您的请求缓存在调度程序中,而不是每次都传递给 AEM,请使用:

/filter {
 /0001 { /type "deny" /method "POST" /url "/etc/*" }
 /0002 { /type "allow" /method "GET" /url "/etc/*" /query "a=*" }
}

在您的调度程序配置中(详见 https://docs.adobe.com/content/help/en/experience-manager-dispatcher/using/configuring/dispatcher-configuration.html)。

我终于能够解决我的问题。尽管我仍然不了解全貌。这是我的最终条件和规则:

RewriteCond %{QUERY_STRING} ^.
RewriteRule ^/(.*)\.html$ /.html [QSD,PT]

添加 "PT" 和 "QSD" 使 Apache 不会 return "client denied" 错误。 QUERY_STRING 周围的条件只是为了确保 Apache 只处理那些真正在 URL 中有查询参数的请求,或者技术上至少有一个字符