我想确保我的网站的某些URL,SSL会使用。 我看到了很多的答案已经在SO。
强制重定向到SSL的所有网页除了一个
所以,我想我会用mod_rewrite
。
我的问题是有关如何配置虚拟主机跑了过来我Django应用程序 HTTP
和过HTTPS
没有问题。 我使用WSGI
。
难道只是复制了配置有问题*:443
及以上*:80
? 我应该怎么做才能有最好的配置?
我想确保我的网站的某些URL,SSL会使用。 我看到了很多的答案已经在SO。
强制重定向到SSL的所有网页除了一个
所以,我想我会用mod_rewrite
。
我的问题是有关如何配置虚拟主机跑了过来我Django应用程序 HTTP
和过HTTPS
没有问题。 我使用WSGI
。
难道只是复制了配置有问题*:443
及以上*:80
? 我应该怎么做才能有最好的配置?
如果您WSGI实际上意味着阿帕奇/ mod_wsgi的,那么虽然安装WSGI应用程序通常会得到自己的子解释器运行的80/443分裂是一个特例,即使在不同的虚拟主机,只要挂载点WSGIScriptAlias和服务器名都是一样的,他们将被合并。
<VirtualHost *:80>
ServerName www.example.com
WSGIScriptAlias / /some/path/django.wsgi.
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
WSGIScriptAlias / /some/path/django.wsgi.
</VirtualHost>
这将发生的守护模式为好,但与守护进程模式,你需要在第一个虚拟主机定义来定义只有一个守护进程组,然后只是指源自都与WSGIProcessGroup。
<VirtualHost *:80>
ServerName www.example.com
WSGIDaemonProcess mydjangosite ...
WSGIProcessGroup mydjangosite
WSGIScriptAlias / /some/path/django.wsgi.
</VirtualHost>
<VirtualHost *:444>
ServerName www.example.com
WSGIProcessGroup mydjangosite
WSGIScriptAlias / /some/path/django.wsgi.
</VirtualHost>
该WSGIProcessGroup只能像到虚拟主机的相同服务器名称到达对面。
Django提供用于确定何时请求经由HTTPS从WSGI变量导出与请求称为“wsgi.url_scheme”,其是由设置的mod_wsgi传来is_secure()方法。
所以,你将有一个单一的Django WSGI脚本文件,并设置文件。 你只需要复制应用程序安装在阿帕奇/ mod_wsgi的配置decsribed。
除了使用mod_rewrite的,你也可以使用Django来控制SSL重定向。
下面是从中间件的修改版本的Satchmo项目 。 我比较喜欢这种方法比mod_rewrite的更好,因为它更容易管理。
要使用它,通过“SSL”:真到您的网址的conf:
urlpatterns = patterns('some_site.some_app.views',
(r'^test/secure/$','test_secure',{'SSL':True}),
)
下面是中间件的代码:
from django.conf import settings
from django.http import HttpResponseRedirect, get_host
SSL = 'SSL'
def request_is_secure(request):
if request.is_secure():
return True
# Handle forwarded SSL (used at Webfaction)
if 'HTTP_X_FORWARDED_SSL' in request.META:
return request.META['HTTP_X_FORWARDED_SSL'] == 'on'
if 'HTTP_X_SSL_REQUEST' in request.META:
return request.META['HTTP_X_SSL_REQUEST'] == '1'
return False
class SSLRedirect:
def process_request(self, request):
if request_is_secure(request):
request.IS_SECURE=True
return None
def process_view(self, request, view_func, view_args, view_kwargs):
if SSL in view_kwargs:
secure = view_kwargs[SSL]
del view_kwargs[SSL]
else:
secure = False
if settings.DEBUG:
return None
if getattr(settings, "TESTMODE", False):
return None
if not secure == request_is_secure(request):
return self._redirect(request, secure)
def _redirect(self, request, secure):
if settings.DEBUG and request.method == 'POST':
raise RuntimeError(
"""Django can't perform a SSL redirect while maintaining POST data.
Please structure your views so that redirects only occur during GETs.""")
protocol = secure and "https" or "http"
newurl = "%s://%s%s" % (protocol,get_host(request),request.get_full_path())
return HttpResponseRedirect(newurl)
这里,你可以应用到应有HTTPS意见的视图修饰。
from functools import wraps
from django.conf import settings
from django.http import HttpResponseRedirect
def require_https(view):
"""A view decorator that redirects to HTTPS if this view is requested
over HTTP. Allows HTTP when DEBUG is on and during unit tests.
"""
@wraps(view)
def view_or_redirect(request, *args, **kwargs):
if not request.is_secure():
# Just load the view on a devserver or in the testing environment.
if settings.DEBUG or request.META['SERVER_NAME'] == "testserver":
return view(request, *args, **kwargs)
else:
# Redirect to HTTPS.
request_url = request.build_absolute_uri(request.get_full_path())
secure_url = request_url.replace('http://', 'https://')
return HttpResponseRedirect(secure_url)
else:
# It's HTTPS, so load the view.
return view(request, *args, **kwargs)
return view_or_redirect
我们使用一些简单的中间件要检查基本URL 必须是HTTPS模式的网址列表,所有的人都被迫HTTP模式。 这里最大的告诫是,任何POST数据,除非你要特别小心(它并没有在我们的例子没关系)丢失。 我们对加入,需要信用卡号码的网页正在做这和像这样,只要他们在这条管道,我们迫使他们到HTTPS。