2011-04-08 75 views
2

我正在構建一個Django應用程序,它將在所有面向用戶的頁面上都需要SSL。在其他需要SSL的項目中,當服務器從同一臺服務器上的其他虛擬主機提供媒體文件時,我遇到了複雜問題。例如,該頁面爲:https://www.mysite.com,但它引用http://media.mysite.com/css/screen.css,瀏覽器隨後向用戶顯示安全警告。Django SSL證書和靜態媒體

我的理解是,它是Django的最佳實踐,至少將靜態文件保留在自己的虛擬主機上,據我所知 - 它需要像media.blahblah.com這樣的子域名。

顯然,SSL上有很多Django應用程序,所以我必須缺少一些東西。有關如何管理的任何建議?

回答

4

一般的答案是,您需要更改您用來將靜態文件引用到使用HTTPS的URL的URL。使用相對路徑(/static/css/screen.css)而不是絕對URL(http:// ...)會使您的媒體根據引用頁面自動從HTTP切換到HTTPS,但在嘗試時強迫您的手根據下面描述的最佳做法提供服務。

如果您使用的是帶有contrib.staticfiles的Django 1.3,那麼您似乎只需要更改STATIC_URL設置。如果沒有,你將不得不手動更新路徑(或者你正在指定你的靜態資產)。

像CSS和JavaScript這樣的靜態媒體的最佳實踐表明,您應該從網絡服務器(而不僅僅是虛擬主機)爲它們提供不同於提供Django頁面的服務。這裏的想法是,你可以使用一個佔地面積小的網絡服務器來快速提供這些簡單的文件。如果您從運行Django站點的同一個Web服務器爲它們提供服務,那麼很可能會加載一些額外的模塊,但不會用於剛剛提供靜態文件的請求。

由於您要爲保護靜態文件,你有兩個選擇:

  1. 你要麼需要獲得單獨(或通配符)SSL證書爲您的靜態文件的Web服務器。
    • 精讀:證書
    • 精讀額外費用:你必須指定一個不同的域(而不是在第一段中的相對路徑),以滿足您的靜態文件。
  2. 在處理所有網站請求的反向代理上設置SSL。你仍然從不同的webservers服務你的靜態文件和Django頁面,但代理根據URL或路徑知道要連接哪一個(例如:來自靜態web服務器的proxy「/ static」,其他所有來自Django web服務器) 。
    • 專業:是否允許您使用相對路徑到您的媒體。
    • 合同:額外的系統配置。
+0

謝謝,這就是我正在尋找的解釋! – jonathanatx 2011-04-08 19:56:36