2009-12-25 58 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