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'),
)   

在 development 上部署时runserver,所有内容都正确链接和加载。当我将整个myapp目录部署到 Apache 上的 Django 根目录时,我发现它没有按预期链接。

例如,如果我链接到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按照 Reinbach 的建议修改了我的。现在显示为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

我相信您想更改您的 WSGIScriptAlias ,因为您当前希望example.com/myapp/login在您的示例显示您尝试使用时处理它example.com/login

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

请参阅如何将 Django 与 Apache 和 mod_wsgi 一起使用

于 2012-09-07T12:34:04.980 回答
1

长话短说

自 Apache 2.4.x 起,Allow 和 Deny 已被弃用,请改用 Require all grant(或 denied)。

长篇大论

我在尝试使用 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 指令更改为 Require all grant。例如:

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

然而,这只是我可以提出的试错解决方案。我对它为什么起作用没有深入的了解,但 Order and Allow 不起作用。

PPPS哦,现在我知道了。自 Apache 2.4.x 起,Allow 和 Deny 已被弃用。好的答案可以在这里找到。

于 2013-04-27T07:48:02.030 回答