我有一个静态网站。
我想要用最简单的密码保护目录的方法,以及用于添加/删除用户的基本管理 UI。我将拥有如此少的用户,以至于我不关心性能。
不管是PHP还是Django什么的,我只想要一个完整的软件包。
Apache 基本身份验证不好,因为您无法注销。也没有用于添加用户的 UI。
我尝试将所有内容都抛在 Django 身份验证之后,并通过 Django 提供文件。但是,Chrome 将我所有的文本/CSS header 视为文本/纯文本,因此我没有显示任何样式表。
我无法在我的服务器上使用 mod_xsendfile,因为我无法重新配置 Apache 以添加新模块。无论如何,我认为这种方法有点矫枉过正。
有没有实现静态站点basic admin认证的代码包?
最佳答案
我使用 nginx,这通常是我的解决方案。也许与此类似的东西可用于 Apache。不知道。
在 nginx 中,代理可以返回带有 header X-Accel-Redirect
的响应,其中包含 nginx 应该重定向的位置。例如使用以下 nginx 配置:
server {
...
location / {
proxy_pass: ...;
}
location /media/secure/ {
internal;
alias ...;
}
}
如果代理通行证将返回:
X-Accel-Redirect: /media/secure/somefile;
然后 nginx 会将来自代理的请求重定向到 /media/secure/
位置,从而提供静态文件。
所以我通常在 Django 中对用户进行身份验证,然后将带有位置的 header 返回到 nginx 服务的文件。这很好,因为 Django 不必提供静态文件,用户不能只访问该安全位置(因为 internal
指令),还因为如果所有 mime 类型都在 nginx 中配置,那么所有文件都正确提供...
同样,这是针对 nginx 的,而不是针对 Apache 的,但也许 Apache 也有类似的东西。
编辑
这是一个简单的 Django 代码片段,假设您对 nginx 使用与上述相同的设置。如果 GET 中提供了它的路径,则此 View 提供安全文件:
@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
那么如果您将此 View 添加到 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
关于django - 为静态站点设置密码保护的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12488163/