为静态站点设置密码保护的最简单方法



我有一个静态站点。

我想要一种最简单的密码保护目录的方法,使用一个用于添加/删除用户的基本管理UI。我的用户太少了,所以我不关心性能。

我不在乎是PHP还是Django,我只想要一个完整的软件包。

  • Apache基本身份验证不好,因为您无法注销。也没有用于添加用户的UI。

  • 我试着把所有东西都放在Django auth后面,并通过Django提供文件。然而,Chrome将我所有的text/css标题都视为text/plain,所以我没有显示任何样式表。

  • 我不能在服务器上使用mod_xsendfile,因为我不能重新配置Apache来添加新模块。无论如何,我认为这种方法是过分的。

是否有一个代码包可以实现静态站点的基本管理员身份验证?

我使用nginx,这通常是我的解决方案。也许类似的东西可以用于Apache。不知道。

在nginx中,proxy可以返回一个头部为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指令),还因为如果所有mime类型都在nginx中配置,那么所有文件都会得到正确的服务。。。

同样,这是针对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:

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

您可以通过以下方式请求安全文件:

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

它将提供来自的文件

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

最新更新