2012-09-07 57 views
0

我有以下目錄結構Django部署在Apache - 目錄佈局

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

manage.py是在myapp目錄Django應用程序。

在項目的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,一切正確的鏈接和負載。當我將整個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萊納巴赫的建議。現在它讀取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塊

回答

3

我相信你想改變你的WSGIScriptAlias,因爲你現在有它e xpecting處理example.com/myapp/login,而你的樣品是表現出你試圖使用example.com/login

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

How to use Django with Apache and mod_wsgi

+0

您將需要爲此應用程序定義一個VirtualHost,然後設置「DocumentRoot/var/www/django-projects/myapp」 – Reinbach

1

長話短說

允許和因爲Apache 2.4.x的拒絕代理已被棄用,使用要求所有改爲(或拒絕)。

漫長的歷史

我遇到了同樣的問題,而試圖建立的Django與Apache和mod_wsgi的。我不完全知道爲什麼出現這種情況,但是當我在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> 

一切工作正常的。

我不確定這是否是解決問題的正確和安全的方式,但我希望它可以幫助。

P.S.我認爲這不應該造成很多安全問題,因爲根目錄是別名反正:WSGIScriptAlias//var/www/django-projects/myapp/myapp_settings/wsgi.py,但我可能worng。

P.P.S.看起來更好的解決方案是將這些行取消註釋,但將Order和Allow指令更改爲需要所有批准。例如:

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

但是,這只是一個試驗和錯誤的解決方案,我可以想出來。我沒有深刻的理解它爲什麼可以工作,但Order和Allow沒有。

P.P.P.S哦,現在我知道了什麼。允許和拒絕自Apache 2.4.x以來已棄用。很好的答案可以找到here