我的django应用程序(让我称之为partlysecureapp
)有一个所有人都可以看到的索引页面。所有其他页面(可以从索引页面上的链接访问)需要用户登录。我想使用apache2中使用SSL的应用程序。
我已经在使用SSL的apache上部署了一个应用程序(比如mysecureapp
),其中所有页面都需要用户登录。我已按如下方式设置了此配置。
我的apache2位于/etc/apache2
,具有以下目录结构。
/etc/apache2/
|--conf.d---*charset,security,localized-error-pages*
|---mods-available---...
|---mods-enabled---...
|---sites-available---default,default-ssl,ssl
|---sites-enabled---shortcut to ssl
|---apach2.conf
|---httpd.conf
|---ports.conf
|---magic
|---envvars
对于secureapp
,我已将其设置在文件sites-available/ssl
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /home/dev/python/django/mysecureapp
SSLEngine on
SSLOptions +StrictRequire
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
...
WSGIScriptAlias /mysecureapp /home/dev/python/django/mysecureapp/mysecureapp.wsgi
Alias /site_media/ /home/dev/python/django/mysecureapp/media/
</VirtualHost>
这完美地运作..
部署我的partlysecureapp
,
http://127.0.0.1:8080/partlysecureapp/
需要显示所有人都可以访问的索引页面。
但是
../partlysecureapp/link1/
../partlysecureapp/link2/
../partlysecureapp/link3/
需要登录,并应通过ssl。
提供我想,我需要为WSGIScriptAlias
添加另一个partlysecureapp
。我是否需要为DocumentRoot
添加另一个partlysecureapp
?如何告诉apache从端口8080
和其他人通过ssl端口服务索引页面?
截至目前,/etc/apache2/httpd.conf
为空。只有sites-available/ssl
文件具有VirtualHost
元素。
答案 0 :(得分:5)
首先,让我们将问题分开:一件事是要求登录,另一件是要求SSL。前者是Django特有的,应该在你的观点中处理;对于后者,恕我直言,您应该考虑通过SSL提供一切的可能性,这将简化您的设置。当然,还有一些开销,由您来决定是否对您的特定情况重要。
那就是说,对于你提出的方案:
要从普通HTTP提供任何,您需要侦听端口80
(或者,在您的情况下,8080
)。因此,您需要一个单独的VirtualHost
绑定到该端口,并为自己创建一个单独的WSGI应用程序。
要允许来自此虚拟主机的单个路径(您的索引文件),但要求受SSL保护的其他所有内容服务,您可以使用mod_rewrite
:
RewriteEngine On
RewriteRule ^/partlysecureapp$ - [L,NC]
RewriteRule (.*) https://127.0.0.1/partlysecureapp%{REQUEST_URI} [L,R=301]
第一条规则告诉Apache如果路径完全,就像你的根路径一样,不要执行任何重定向;第二个将其他所有内容重定向到https
(由*:443
虚拟主机处理)。
(注意:您可能还希望在没有SSL的情况下提供/site_media
)
然后你可以简单地添加你的WSGI别名;即使Django将用户发送到另一个页面,Apache也会确保通过SSL提供该页面。
您的最终代码将类似于:
<VirtualHost *:8080>
ServerAdmin webmaster@localhost
DocumentRoot /home/dev/python/django/partlysecureapp
RewriteEngine On
RewriteRule ^/partlysecureapp$ - [L,NC]
RewriteRule ^/site_media - [L,NC]
RewriteRule (.*) https://127.0.0.1/partlysecureapp%{REQUEST_URI} [L,R=301]
...
WSGIScriptAlias /partlysecureapp /home/dev/python/django/partlysecureapp/partlysecureapp.wsgi
Alias /site_media/ /home/dev/python/django/partlysecureapp/media/
</VirtualHost>
您的SSL保护虚拟主机的代码与mysecureapp
虚拟主机的代码相同(当然,使用partlysecureapp
代替;请注意,您可以拥有两个应用并排运行,只需注意您的MEDIA
和STATIC
路径。