我的 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 服务。
我想,我需要为我的 partlysecureapp
添加另一个 WSGIScriptAlias
。我是否需要为 partlysecureapp
添加另一个 DocumentRoot
?如何告诉 apache 通过 ssl 端口从端口 8080
和其他端口为索引页面提供服务?
截至目前,/etc/apache2/httpd.conf
是空白的。只有 sites-available/ssl
文件有一个 VirtualHost
元素。
最佳答案
首先,让我们在这里分开关注点:一件事是需要登录,另一件事是需要 SSL。前者是 Django 特有的,应该在你的 View 中处理;对于后者,恕我直言,您应该考虑通过 SSL 提供一切服务的可能性,这将大大简化您的设置。当然,这会产生一些开销,您可以自行决定它对您的特定情况是否重要。
也就是说,对于您提出的方案:
要从纯 HTTP 提供任何内容,您需要监听端口
80
(或者,在您的情况下,8080
).因此,您需要一个单独的VirtualHost
绑定(bind)到该端口,并为其自身提供一个单独的 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
路径)。
关于django - 某些页面需要 ssl 的 django 应用程序的 apache 中的设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13455977/