2

我计划构建一个 Django 应用程序来生成和以后的服务器静态页面(可能存储在 S3 上)。当用户访问像 mysite.com/static-pages/12345 这样的 url 时,应该提供我的 S3 存储桶中名为 12345.html 的静态文件。例如,该静态文件可能是我的网站为用户生成的博客页面的静态 html 页面。

在呈现为 Django 模板的页面上包含静态资源(如 CSS/Javascript 文件)不同,因为我已经知道如何使用 Django 模板和 SQL 数据库 - 我不熟悉的是我的“数据”现在是一个文件S3 而不是数据库中的条目并且我实际上不需要使用模板。

如何准确地检索请求的数据(即静态页面)并将其返回给用户?我想在合理的范围内最大限度地减少性能损失,当然如果用户直接从 S3 请求他们的静态页面(我不希望他们这样做),那当然会最快。

一些额外的问题:我在其他地方读到了一个 django flatpages 应用程序,它将 html 页面存储在数据库中,但似乎静态 html 页面最好存储在像 S3 这样的文件系统上,不是吗?有没有办法让请求进入我的 Django 应用程序并让 S3 直接提供文件,同时让它看起来来自我的应用程序(即浏览器 url 仍然显示 mysite.com/static-pages/12345,但是页面没有通过我的 Django 服务器)?

非常感谢!

4

2 回答 2

0

Amazon S3 不支持 URL 重写(它不是 Web 服务器),因此您别无选择,只能将请求代理到可以为您重写 URL 的 Web 服务器或服务。

您可以使用您控制的 Web 服务器并按照此处的说明让 apache 重写 URL,但是当整个重点是加载静态网站时,这似乎有些浪费。

或者,如果您想纯粹留在 S3 中,我有一个可能可行的解决方案:

您可以选择指定在 404 的情况下将返回给用户浏览器的 HTML 文档 - 错误文档。您可以创建一个小 HTML 页面来检查当前 URL,并简单地更改 window.location 以转到“重写”没有.html扩展名的 url:

<html>
<script>
    var slash = window.location.lastIndexOf("/");
    var dot = window.location.lastIndexOf(".");

    if (slash < dot) && (dot != -1) {
        window.location = window.location + ".html";
    }
</script>
</html>

显然你想让它更健壮,但你明白了。

不利的一面是,使用 url 对静态页面的每个请求都会从用户的浏览器到您的服务器进行额外的往返(一次用于 404 页面,然后一次用于获取真实页面)。

此外,您需要调整我上面的代码,以避免在实际 url 不正确的情况下触发 404 循环,方法是添加如下检查:

var loopcheck = window.location.IndexOf(".html");
if (lookcheck != -1) {
    window.location = "real404.html";
    return;
}

希望有帮助。

于 2013-03-06T07:16:10.087 回答
0

您只需在 /static-pages/12345/ 文件夹中创建 index.html ,它就会被提供。

于 2013-04-03T08:38:19.947 回答