0

次のディレクトリ構造を持つDjangoアプリケーションがあります

/myapp/
   /login/
   /myapp_settings/
   /subapp1/
   /supapp2/

manage.pymyappディレクトリにあります。

プロジェクトurl.pyには、次のようなURL設定があります。

urlpatterns = patterns('',
    url(r'^subapp1/', include('subapp1.urls')),
    url(r'^xhr/', include('subapp1.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^subapp2/', include('smart_selects.urls')),

        # Login / logout.
    url(r'^login/$', 'django.contrib.auth.views.login'),
    url(r'^logout/$', 'django.contrib.auth.views.logout', {'next_page': '/subapp1/'}, name='auth_logout'),
    url(r'^logout/(?P<next_page>.*)/$', 'django.contrib.auth.views.logout', name='auth_logout_next'),
)   

開発にデプロイするrunserverと、すべてが正しくリンクおよびロードされます。ディレクトリ全体をApacheのDjangoルートにデプロイするとmyapp、期待どおりにリンクされていないことがわかります。

たとえば、にリンクするとexample.com/login/、Apache 404が表示されます。これは、特定のディレクトリに対して仮想ディレクトリ構成が定義されていないためだと思います。

アプリケーション用にApacheで次の設定を行っています。

WSGIScriptAlias /myapp /var/www/django-projects/myapp/myapp_settings/wsgi.py
WSGIPythonPath /var/www/django-projects/myapp

Alias /media/ /var/www/django-projects/myapp/media/
Alias /static/ /var/www/django-projects/myapp/static/


<Directory /var/www/django-projects/myapp/static>
Order deny,allow
Allow from all
</Directory>

<Directory /var/www/django-projects/myapp/media>
Order deny,allow
Allow from all
</Directory>

<Directory /var/www/django-projects/myapp/myapp_settings/>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

使用するURLパターンごとにエイリアスとディレクトリの構成が必要ですか?もしそうなら、どうすればURLパターンをやり直して、これを行う必要がないようにできますか。アプリケーションをデプロイするときに、この余分なApache構成をすべて行う必要はありません。

編集:WSGIScriptAlias私はラインバッハの提案に従って自分を修正しました。を読み取りますWSGIScriptAlias / /var/www/django-projects/myapp/myapp_settings/wsgi.py。ただし、これでも404が返されます。Apacheログのエラーには

[Fri Sep 07 09:11:00 2012] [error] [client 192.189.x.x] File does not exist: /var/www/html/login

/var/www/html代わりに(デフォルトのApacheルート)を検索していることに注意してください/var/www/django-projects

EDIT2:このセクションのVirtualHostブロックを添付しています

WSGIPythonPath /var/www/django-projects/myapp
<VirtualHost sub.example.com:80>
     DocumentRoot /var/www/django-projects/myapp
     ServerName sub.example.com
     WSGIScriptAlias / /var/www/django-projects/myapp/myapp_settings/wsgi.py


     Alias /robots.txt /var/www/django-projects/myapp/static/robots.txt
     Alias /favicon.ico /var/www/django-projects/myapp/static/favicon.ico
     AliasMatch ^/([^/]*\.css) /var/www/django-projects/myapp/static/css/$1
     AliasMatch ^/([^/]*\.js) /var/www/django-projects/myapp/static/js/$1
     AliasMatch ^/([^/]*\.png) /var/www/django-projects/myapp/static/images/$1
     AliasMatch ^/([^/]*\.swf) /var/www/django-projects/myapp/static/swf/$1


     Alias /media/ /var/www/django-projects/myapp/media/
     Alias /static/ /var/www/django-projects/myapp/static/

     <Directory /var/www/django-projects/myapp/static>
         Order deny,allow
         Allow from all
     </Directory>
     <Directory /var/www/django-projects/myapp/media>
         Order deny,allow
         Allow from all
     </Directory>
     <Directory /var/www/django-projects/myapp/myapp_settings/>
         <Files wsgi.py>
              Order deny,allow
              Allow from all
         </Files>
     </Directory>
</VirtualHost>
4

2 に答える 2

3

example.com/myapp/loginサンプルが使用しようとしていることを示している間に、現在処理することを期待しているWSGIScriptAliasを変更したいと思います。example.com/login

WSGIScriptAlias / /var/www/django-projects/myapp/myapp_settings/wsgi.py

Apacheおよびmod_wsgiでDjangoを使用する方法を参照してください

于 2012-09-07T12:34:04.980 に答える
1

ロングストーリーショート

[許可]と[拒否]はApache2.4.x以降非推奨になりました。代わりに、[すべて許可(または拒否)を要求]を使用してください。

ロングストーリー

Apacheとmod_wsgiを使用してDjangoをセットアップしようとしているときに、同じ問題が発生しています。なぜこれが起こるのか完全にはわかりませんが、httpd.confの次の行をコメントアウトすると

# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other 
# <Directory> blocks below.
#
#<Directory />
#    AllowOverride none
#    Require all denied
#</Directory>

すべてが正常に動作します。

これが問題を解決するための適切で安全な方法であるかどうかはわかりませんが、役立つことを願っています。

PSルートディレクトリはとにかくエイリアス化されているので、これによってセキュリティ上の問題が発生することはあまりないと思いますWSGIScriptAlias / /var/www/django-projects/myapp/myapp_settings/wsgi.py

PPSより良い解決策は、これらの行をコメント化しないままにすることですが、OrderディレクティブとAllowディレクティブを変更して、Requireallgrantedを優先するようにします。例えば:

<Directory /var/www/django-projects/myapp/myapp_settings/>
<Files wsgi.py>
Require all granted
#Order deny,allow
#Allow from all
</Files>
</Directory>

ただし、これは試行錯誤の解決策にすぎません。なぜそれが機能するのか深く理解できませんでしたが、OrderandAllowは機能しません。

PPPSああ、今私は何を知っています。許可と拒否は、Apache2.4.x以降非推奨になりました。良い答えはここにあります。

于 2013-04-27T07:48:02.030 に答える