2012-09-19 77 views
2

我有一個靜態網站。爲靜態網站設置密碼保護的最簡單方法是什麼?

我想用最簡單的方法來保護目錄的密碼,使用基本的管理用戶界面來添加/刪除用戶。我會有這麼幾個用戶,我不關心性能。

我不在乎它是PHP還是Django或其他,我只想要一個完整的軟件包。

  • Apache basic auth不好,因爲你不能註銷。也沒有添加用戶的界面。

  • 我試着扔背後Django的權威性的一切,通過Django的服務文件。但是,Chrome會將所有文本/ CSS標題視爲文本/純文本,因此我沒有看到任何樣式表。

  • 我不能在我的服務器上使用mod_xsendfile,因爲我不能重新配置Apache以添加新的模塊。無論如何,我認爲這種做法有點矯枉過正。

是否有一個代碼包實現與靜態網站的基本管理身份驗證?

回答

6

我使用nginx,這通常是我的解決方案。也許類似這樣的東西可以用於Apache。不知道。

在nginx的,代理可以返回與頭X-Accel-Redirect的響應與該位置到nginx的是假設重定向。例如用下面的nginx的配置:

server { 
    ... 
    location/{ 
     proxy_pass: ...; 
    } 
    location /media/secure/ { 
     internal; 
     alias ...; 
    } 
} 

如果代理通將返回:

X-Accel-Redirect: /media/secure/somefile; 

然後nginx的會從代理請求重定向到/media/secure/位置,從而服務於靜態文件。

所以我通常在Django驗證用戶身份,然後就返回頭與位置,然後nginx的提供文件。這很好,因爲Django不必提供靜態文件,用戶不能只訪問安全位置(因爲internal指令),並且因爲如果在nginx中配置了所有MIME類型,則所有文件都可以正常服務。 ..

同樣,這是爲nginx,而不是爲Apache,但也許有類似的東西在那裏爲Apache。

編輯

下面是一個簡單的Django代碼片段假設你使用相同的設置上面nginx的。這種觀點提供安全的文件,如果在GET提供它的路徑:

@login_required() 
def serve_secure_static(request, file_root=os.path.join(settings.MEDIA_ROOT, 'secure')): 
    if not request.method == 'GET': 
     return HttpResponseBadRequest('Only GET allowed') 

    if not 'file' in request.GET: 
     return HttpResponseBadRequest('File query must be provided') 

    # make sire loggen user is allowed to see the file 
    # maybe check some custom permission 

    file_path = request.GET['file'] 

    # if in DEBUG, make Django serve static file 
    # because nginx might not be configured 
    if settings.DEBUG: 
     abs_file_path = os.path.join(file_root, file_path) 
     file_data = open(abs_file_path, 'rb').read() 
     return HttpResponse(file_data, mimetype=mimetypes.guess_type(file_path)) 

    # else make nginx serve static file 
    else: 
     redirect_url = '/%s' % file_path 
     response = HttpResponse() 
     response['X-Accel-Redirect'] = redirect_url 
     return response 

所以,如果添加此視圖urlconfig則:

http://domain.com/serve_secure_static/?file=path/to/file/here/relative/to/media/secure.css 

url(r'^serve_secure_static/$', 'server_secure_static') 

您可以通過申請安全文件

這將服務從

/media/secure/path/to/file/here/relative/to/media/secure.css 
+0

我相信這是Apache的x-sendfile所做的。如果沒有現有的軟件包,我可能會嘗試你的解決方案,做我想要的。 –

+0

你有適合Django代碼的代碼片段嗎? –

+0

更新了答案 – miki725

相關問題