2009-12-25 59 views
0

我的Django的網站都提供了Apache的配置如下:{%URL管理:索引%}產生錯誤的URL

WSGIScriptAlias /studio /django/studio/bin/django.wsgi 

我的urls.py的樣子:

urlpatterns += patterns(
    'django.contrib', 
    (r'^admin/', include(admin.site.urls)), 
    (r'^accounts/login/$', 'auth.views.login'), 
    (r'^accounts/logout/$', 'auth.views.logout'), 
    ) 

.. .and:

[<a href="{% url admin:index %}">admin</a>] 

...生成到/ admin而不是/ studio/admin的鏈接。 奇怪的是,管理界面本身的網址都很好。

我使用:

Python 2.5.2-3 
Django 1.1.1 
mod_wsgi 2.5-1~lenny1 
apache2 2.2.9-10+lenny6 

誰能告訴我什麼,我做錯了什麼?

歡呼聲,

克里斯

回答

0

這是Django的一個bug,請參閱:

http://code.djangoproject.com/ticket/12464

的問題是,由於Apache的重寫引擎是作爲改寫的結果,我需要在虛擬主機的其他地方做的SCRIPT_URL環境變量已設置。但是,當通過Apache對/進行請求時,PATH_INFO爲空,導致SCRIPT_NAME被錯誤地設置爲空字符串。

在解決此錯誤之前,將以下RewriteRule插入到Apache配置中將確保PATH_INFO永遠不會爲空,從而安全地解決此問題。

RewriteEngine On 
RewriteRule ^/project$ /project/ [R] 
WSGIScriptAlias /project /django/project/bin/django.wsgi 
-1

你的Django實例對此一無所知,因爲它是在WSGI處理的URL的/studio一部分。您必須手動預置它無論是在模板或更好,在urls.py:

在settings.py:

BASE_URL = '/studio' 

在urls.py:

r('^%s/admin/' % settings.BASE_URL, include(admin.site.urls)), ... 

然後您的網址逆轉將按預期工作。你管理鏈接工作,因爲一旦你在管理界面中,所有的鏈接都是相對的。

+1

Django知道'/ studio',它傳遞給SCRIPT_NAME WSGI變量。如果Django仍然沒有在需要的時候自動履行,Django就可能被打破。 Django遇到的這些問題應該在1.0版本候選版本中得到解決。我建議在Django用戶郵件列表中關注這個問題。 – 2009-12-25 10:23:48

+0

kibitzer:我很抱歉,但肯定在Django 1.1的情況下,你的回答顯然是錯誤的。 無需BASE_URL kludgery,以下解決方法工作在此期間: 正上方WSGIScriptAlias我說: 重寫規則^/newstudio $/newstudio/[R] 當我我會在這裏發表一個答案得到了問題的底部... – 2009-12-26 11:06:19

+0

這不是錯的,它的工作原理。是的,這並不完美,但您的RewriteRule與解決您的問題完全無關。 – kibitzer 2009-12-29 09:21:50