django - 某些页面需要 ssl 的 django 应用程序的 apache 中的设置

标签 django ssl apache2

我的 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 提供一切服务的可能性,这将大大简化您的设置。当然,这会产生一些开销,您可以自行决定它对您的特定情况是否重要。

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

  1. 要从纯 HTTP 提供任何内容,您需要监听端口 80(或者,在您的情况下,8080 ).因此,您需要一个单独的 VirtualHost 绑定(bind)到该端口,并为其自身提供一个单独的 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 代替;另请注意,您可以拥有 两个 应用并排运行,只需注意您的MEDIASTATIC 路径)。

关于django - 某些页面需要 ssl 的 django 应用程序的 apache 中的设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13455977/

相关文章:

apache - 如何为网上商店的结帐链接强制使用 SSL

node.js - 在 AWS EC2 上部署 https node express 服务器托管网站

.htaccess - apache 配置的等效值是多少

perl - 在 Apache httpd-2.4.2 上安装 mod_perl-2.0.7

python - 无法使用 Python 的 requests 模块登录 ASP.NET 网站

Django 重定向()不工作

python - Django 在 docker 。看不到日志

Django 管理员自动完成关闭

python - 将 ssl 证书信息从 nginx 传递到 flask

PHP 5.3.2,我在哪里可以找到 php5apache2_2.dll?