7

私のdjangoアプリ(私はそれと呼びますpartlysecureapp)には、すべての人に表示されるインデックスページがあります。他のすべてのページ(インデックスページのリンクからアクセス可能)には、ユーザーがログインする必要があります。apache2でSSLを使用してアプリを使用したいと思います。

私はすでにmysecureappSSLを使用して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ますpartlysecureappDocumentRootのために別のものを追加する必要がありpartlysecureappますか?8080sslポートを介してポートなどからインデックスページを提供するようにapacheに指示するにはどうすればよいですか?

現在のところ、/etc/apache2/httpd.confは空白です。sites-available/sslファイルだけにVirtualHost要素があります。

4

1 に答える 1

5

まず、ここで懸念事項を分けましょう。1つはログインを要求することであり、もう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に指示します。2つ目は、他のすべてをにリダイレクトします(仮想ホスト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で保護された仮想ホストのコードは同じものになりますmysecureapp(もちろん、代わりに使用します。両方のアプリを並べて実行partlysecureappできることにも注意してください。パスに注意してください)。MEDIASTATIC

于 2012-11-24T22:40:24.833 に答える