【问题标题】:settings in apache for django app which need ssl for some pages某些页面需要 ssl 的 django 应用程序的 apache 设置
【发布时间】:2012-11-19 14:36:53
【问题描述】:

我的 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 提供服务。

我想,我需要为我的partlysecureapp 添加另一个WSGIScriptAlias。我需要为partlysecureapp 添加另一个DocumentRoot 吗?如何告诉apache通过ssl端口从端口8080和其他人提供索引页面?

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

【问题讨论】:

    标签: django ssl apache2


    【解决方案1】:

    首先,让我们将这里的关注点分开:一件事是要求登录,另一件事是要求 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 虚拟主机处理)。

      (注意:您可能还想在不使用 SSL 的情况下提供 /site_media

    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 保护的虚拟主机的代码与 mysecureapp 的代码相同(当然,使用 partlysecureapp;另请注意,您可以同时运行 both 应用程序-side,请注意您的 MEDIASTATIC 路径)。

    【讨论】:

    • 免责声明:我也是一名开发人员转为系统管理员的必要人员,因此请谨慎对待我的建议。我建议将此问题迁移到serverfault,在那里您可能会得到更好的答案,但虽然它有一个开放的赏金,但它无法完成。
    猜你喜欢
    • 2011-11-04
    • 2014-01-11
    • 2012-10-10
    • 1970-01-01
    • 2020-05-19
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多