为什么AEM对没有扩展的请求返回403?

为什么AEM对没有扩展的请求返回403?,aem,sling,Aem,Sling,默认情况下,所有GET请求首先转到DefaultGetServlet。基于扩展,它将请求委托给渲染器。现在,如果请求URI中没有扩展,为什么AEM发送403(禁止)?最多,如果AEM无法提供此服务,它可能会发送错误的请求。即使您以管理员用户身份登录,AEM也会发送403(如果有帮助的话,它具有最高级别的授权) 例如: http://localhost:4502/content/geometrixx/en/events 此URL将以403响应。鉴于 http://localhost:4502/c

默认情况下,所有GET请求首先转到DefaultGetServlet。基于扩展,它将请求委托给渲染器。现在,如果请求URI中没有扩展,为什么AEM发送403(禁止)?最多,如果AEM无法提供此服务,它可能会发送错误的请求。即使您以管理员用户身份登录,AEM也会发送403(如果有帮助的话,它具有最高级别的授权)

例如:

http://localhost:4502/content/geometrixx/en/events
此URL将以403响应。鉴于

http://localhost:4502/content/geometrixx/en/events.html
将不会出现任何问题。

自2009年关闭的吊索票起,如果未找到任何渲染器,则返回状态代码应为404

您可以在
doGet
方法中的
DefaultGetServlet.java
的源代码中看到这一点

以下内容在AEM 6.3中进行了测试,但在6.0中应相同+

例如,如果您尝试访问,您将得到一个404,sling进度跟踪器将记录
没有扩展部分的渲染器

现在,请允许我重新表述您的问题,为什么extension=
null
返回403?

如果查看sling progress tracker响应,您可能会注意到以下日志:
使用org.apache.sling.servlets.get.impl.helpers.StreamRenderServlet为extension=null呈现

这意味着对于
null
扩展,Sling将使用
StreamRenderServlet
()尝试并呈现资源。在代码中的某个地方,或者可能是后面应用的过滤器导致您看到的403响应代码。您必须自己调试该程序,并找出返回403的确切位置。

补充说明:

在没有扩展名的情况下,Sling假定您正在尝试列出该目录路径的内容,并在该路径下查找索引文件。当它找不到该索引文件时,会抛出禁止的错误

如果您在
事件
节点下添加一个索引文件,并尝试请求相同的无扩展url,它将为该索引文件提供服务。
也就是说,当您在
/content/geometricxx/en/events
下添加索引文件(
index.html
)时,
所有对
http://localhost:4502/content/geometrixx/en/events
http://localhost:4502/content/geometrixx/en/events/index.html
将返回相同的结果。

添加到上述内容,如Ahmed所述: 使用URL“
StreamRenderServlet
将执行并解析为以
/
结尾

// redirect to this with trailing slash to render the index
String url = request.getResourceResolver().map(request,resource.getPath())+ "/";
response.sendRedirect(url);
一旦重定向到“” 相同的
StreamRenderServlet
解析为

renderDirectory
as中

将发送403禁止响应

您可以通过为“Apache Sling GET Servlet”felix配置控制台启用“自动索引”来更改此行为。

在“事件”节点下使用“Index.html”对我不起作用。获取了403错误响应,其中包含一些线索,
0日志资源路径信息:SlingRequestPathInfo:Path='/content/geometrixx/en/events',selectorString='null',extension='null',suffix='/'
后缀“/”应该在执行某些操作。
// trailing slash on url means directory listing
if ("/".equals(request.getRequestPathInfo().getSuffix())) {
  renderDirectory(request, response, included);
  return;
}
if (index) {
  renderIndex(resource, response);
} else {
  response.sendError(HttpServletResponse.SC_FORBIDDEN);
}