2012-09-19 75 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

相关问题