gpt4 book ai didi

nginx - 如何自定义MinIO的AccessDenied页面?

转载 作者:行者123 更新时间:2023-12-05 04:27:37 24 4
gpt4 key购买 nike

当 MinIO 链接的到期日期过去时,它会像这样响应 XML:

<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<Key>key-of-the-resource</Key>
<BucketName>bucket-name</BucketName>
<Resource>/path-to/teh-resource</Resource>
<RequestId>16FC78B1C6185XC7</RequestId>
<HostId>5d405266-91b9-XXXX-ae27-c48694f203d5</HostId>
</Error>

有没有办法通过 MinIO 中的某种配置来自定义此页面?我没有在他们的文档中找到任何相关的配置。

其他可能的解决方案:

  • 在我的后端使用重定向链接,并检查此链接是否已过期,然后将其重定向到另一个页面
  • 也许我们可以使用 Nginx,但我不知道指令是什么。感谢您为此提供的帮助。

更新

完整的响应头:

$ curl <minio-url> -I

HTTP/2 403
date: Tue, 05 Jul 2022 12:51:13 GMT
content-length: 0
accept-ranges: bytes
content-security-policy: block-all-mixed-content
strict-transport-security: max-age=15724800; includeSubDomains
vary: Origin
vary: Accept-Encoding
x-amz-request-id: 16FEEFE391X98X88
x-content-type-options: nosniff
x-xss-protection: 1; mode=block

完整响应:

$ curl <minio-url>

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Request has expired</Message><Key>new_structure/7553257.jpg</Key><BucketName>storage</BucketName><Resource>/decodl-storage/new_structure/7553257.jpg</Resource><RequestId>16FEEFFB573XXXXC</RequestId><HostId>5d405266-91b9-xxxx-ae27-c48694f203d5</HostId></Error>

最佳答案

假设您的 403 错误返回时 Content-Type header 被设置为 text/xml,您可以使用 XSL Transformations 将此 XML 响应通过 nginx 转换为 HTML。要做到这一点,你需要 XSLT module ,你应该知道这个模块不是默认构建的,它应该作为动态模块另外安装(或者使用 --with-http_xslt_module 配置启用从源构建 nginx 时的参数)。

安装模块后,您应该在用于将请求代理到 MinIO 后端的位置下指定 xslt_stylesheet 指令:

location ... {
xslt_stylesheet /path/to/error.xslt;
...
}

这是一个 XSLT 文件示例,可用于转换您在问题中显示的 XML 响应:

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" />

<xsl:template match="/">
<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>

<html>
<head>
<title><xsl:value-of select="Error/Code"/></title>
</head>
<style type="text/css">
body {
height: 100vh;
margin: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
p {
font-weight: bold;
}
.itemvalue {
font-family: monospace, monospace;
font-weight: normal;
font-size: 1em;
}
</style>
<body>
<h1><xsl:value-of select="Error/Message"/></h1>
<p>Additional information:</p>
<table><tbody>
<xsl:for-each select="Error/*[not(name()='Code' or name()='Message')]">
<tr>
<td class="itemname"><xsl:value-of select="local-name()"/>:</td>
<td class="itemvalue"><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</tbody></table>
</body>
</html>

</xsl:template>
</xsl:stylesheet>

上述文件应用于响应样本,将为您提供以下内容:

sample rendered HTML screenshot

您可以根据自己的喜好设置输出样式。我认为这个问题与网页设计无关(我不是设计师),但是提供的信息应该足以成为您可以适应您的需求的示例。

更新

如果您的 MinIO 响应带有一些不同的 MIME 内容类型,例如application/xml,您需要使用 xslt_types 指令将该内容类型添加到 XSLT 模块处理的 MIME 类型列表中:

location ... {
xslt_types application/xml;
xslt_stylesheet /path/to/error.xslt;
...
}

进一步深入研究 XSLT,我完成了一些不同的 XSLT 文件。这将仅转换包含 Error 顶级节点的错误消息,而其他任何响应均保持不变:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/Error">
<html>
<head>
<title><xsl:value-of select="./Code"/></title>
</head>
<style type="text/css">
/* custom CSS styles, see the previous example */
</style>
<body>
<h1><xsl:value-of select="./Message"/></h1>
<p>Additional information:</p>
<table><tbody>
<xsl:for-each select="./node()[not(self::Code or self::Message)]">
<tr>
<td class="itemname"><xsl:value-of select="local-name()"/>:</td>
<td class="itemvalue"><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</tbody></table>
</body>
</html>
</xsl:template>

<xsl:template match="/node()[not(self::Error)]">
<xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>

关于nginx - 如何自定义MinIO的AccessDenied页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72771909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com