为什么 AEM returns 403 对于没有扩展名的请求?

Why AEM returns 403 for requests without extensions?

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

示例:

http://localhost:4502/content/geometrixx/en/events

此 URL 将以 403 响应。而

http://localhost:4502/content/geometrixx/en/events.html

将毫无问题地送达。

截至 2009 年关闭的此 sling ticket SLING-1231,如果未找到渲染器,return 状态代码应为 404。

您可以在 DefaultGetServlet.javadoGet 方法的吊索源代码中看到这一点。 source

The following tested on AEM 6.3 but should be the same for 6.0+

例如,如果您尝试访问 http://localhost:4502/content/geometrixx/en/events.something,您会收到 404 并且 sling 进度跟踪器会记录 No renderer for extension something

现在,如果我可以换一种说法,为什么 extension=null return 是 403?

如果您查看 sling 进度跟踪器响应,您可能会注意到此日志: Using org.apache.sling.servlets.get.impl.helpers.StreamRendererServlet to render for extension=null

这意味着对于 null 扩展,Sling 将使用 StreamRendererServlet(source) 来尝试呈现资源。该代码中的某处或者可能是之后应用的过滤器导致您看到的 403 响应代码。您必须自己调试那个并找出 403 的确切位置 returned.

补充 Ahmed 所说的内容:

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

如果您在 events 节点下添加索引文件并尝试请求相同的无扩展名 url,它将提供该索引文件。
也就是说,当你在/content/geometrixx/en/events下添加索引文件(index.html)时, http://localhost:4502/content/geometrixx/en/eventshttp://localhost:4502/content/geometrixx/en/events/index.html 的所有请求都会 return 相同的结果。

如 Ahmed 所述,除上述内容外: URL "http://localhost:4502/content/geometrixx/en/events" StreamRendererServlet will get executed and resolves to redirect logic/ 结尾。

// redirect to this with trailing slash to render the index
String url = request.getResourceResolver().map(request,resource.getPath())+ "/";
response.sendRedirect(url);

一旦重定向到“http://localhost:4502/content/geometrixx/en/events/” 同样的 StreamRendererServlet 解析为 directory listing logic.

// trailing slash on url means directory listing
if ("/".equals(request.getRequestPathInfo().getSuffix())) {
  renderDirectory(request, response, included);
  return;
}

renderDirectory中为indexing will be false,

if (index) {
  renderIndex(resource, response);
} else {
  response.sendError(HttpServletResponse.SC_FORBIDDEN);
}

将发送 403 Forbidden 响应。

您可以通过为 "Apache Sling GET Servlet" felix 配置控制台启用 "Auto Index" 来更改此行为。