为什么 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.java
的 doGet
方法的吊索源代码中看到这一点。 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/events
或 http://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" 来更改此行为。
默认情况下,所有 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.java
的 doGet
方法的吊索源代码中看到这一点。 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/events
或 http://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" 来更改此行为。