7

我的 django 应用程序(让我称之为partlysecureapp)有一个对所有人可见的索引页面。所有其他页面(可从索引页面上的链接访问)需要用户登录。我想在 apache2 中使用带有 SSL 的应用程序。

我已经有一个mysecureapp使用 SSL 部署在 apache 上的应用程序(比如),它包含所有需要用户登录的页面。我为此设置了如下配置。

我的 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. 我需要添加另一个DocumentRootpartlysecureapp?如何告诉apache8080通过ssl端口从端口和其他人提供索引页面?

截至目前/etc/apache2/httpd.conf为空白。只有sites-available/ssl文件有一个VirtualHost元素。

4

1 回答 1

5

首先,让我们将这里的关注点分开:一件事是要求登录,另一件事是要求 SSL。前者是 Django 特有的,应该在你的视图中处理;对于后者,恕我直言,您应该考虑通过 SSL 提供所有服务的可能性,这将大大简化您的设置。当然,有一些开销,由您决定它是否对您的特定情况重要。

也就是说,对于您提出的方案:

  1. 要从纯 HTTP 提供任何服务,您需要侦听端口80(或者,在您的情况下,8080)。因此,您需要单独VirtualHost绑定到该端口,并为其自身使用单独的 WSGI 应用程序。

  2. 要允许来自此虚拟主机的单个路径(您的索引文件),但要求其他所有内容都由受 SSL 保护的主机提供,您可以使用mod_rewrite

    RewriteEngine On
    RewriteRule ^/partlysecureapp$ - [L,NC]
    RewriteRule (.*) https://127.0.0.1/partlysecureapp%{REQUEST_URI} [L,R=301]
    

    第一条规则告诉 Apache 如果路径与您的根路径完全相同,则不要执行任何重定向;第二个将其他所有内容重定向到https(将由您的*:443虚拟主机处理)。

    (注意:您可能也希望在/site_media没有 SSL 的情况下提供服务)

  3. 然后你可以简单地添加你的 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 保护的虚拟主机的代码将与您的代码相同mysecureapppartlysecureapp当然,使用它;另请注意,您可以让两个应用程序并排运行,只需注意您的MEDIASTATIC路径)。

于 2012-11-24T22:40:24.833 回答