Django SSL证书和静态媒体

时间:2011-04-08 14:23:38

标签: django apache ssl

我正在构建一个在所有面向用户的页面上需要SSL的Django应用程序。在需要SSL的其他项目中,当从同一服务器上的不同虚拟主机提供媒体文件时,我遇到了复杂问题。例如,页面为:https://www.mysite.com但它引用了http://media.mysite.com/css/screen.css,浏览器随后会向用户显示安全警告。

我的理解是,Django最好将静态文件保存在自己的虚拟主机上,据我所知,这需要像media.blahblah.com这样的子域。

显然,SSL上有很多Django应用程序,所以我必须遗漏一些东西。关于如何管理的任何建议?

1 个答案:

答案 0 :(得分:4)

一般的答案是,您需要更改用于将静态文件引用到使用HTTPS的URL的URL。使用相对路径(/static/css/screen.css)而不是绝对URL(http:// ...)会使您的媒体根据引用页面自动从HTTP切换到HTTPS,但在尝试时会强制您的手按照下面描述的最佳做法服务。

如果你正在使用带有contrib.staticfiles的Django 1.3,那么你似乎只需要更改STATIC_URL设置。如果没有,您将必须手动更新路径(或者您指定静态资产)。

CSS和JavaScript等静态媒体的最佳做法确实要求您应该从提供Django页面的 webserver (不仅仅是虚拟主机)提供服务。我们认为您可以使用占地面积小的网络服务器来快速提供这些简单文件。如果您从运行Django站点的同一个Web服务器上为它们提供服务,那么很可能会加载许多额外的模块,但不会用于您只是提供静态文件的请求。

由于您需要提供安全的静态文件,因此您有以下几种选择:

  1. 您需要为静态文件网络服务器获取单独的(或通配符)SSL证书。
    • Con :证书的额外费用
    • Con :您必须指定一个不同的域(而不是第一段中描述的相对路径)来提供静态文件。
  2. 在处理网站所有请求的反向代理上设置SSL。您仍然从单独的Web服务器提供静态文件和Django页面,但代理根据URL或路径知道连接到哪一个(例如:来自静态Web服务器的代理“/ static”,来自Django Web服务器的所有其他内容) 。
    • Pro :允许您使用媒体的相对路径。
    • Con :额外的系统配置。