在Django / modwsgi安装程序中重写了URL重写

我试图设置我的Django应用程序与modwsgi在Apache下运行。 我已经定义了以下虚拟主机:

<VirtualHost *> ServerName www.domain.com ServerAlias domain.com WSGIScriptAlias / /home/domain/apache/django.wsgi <Directory /home/domain/apache> Order deny,allow Allow from all Options -Indexes +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^domain.com$ [NC] RewriteRule ^(.*)$ http://www.domain.com/$1 [QSA,L,R=301] </Directory> </VirtualHost> 

最后的重写规则是使www.domain.com成为规范的站点名称。 虽然有一些错误 当我浏览到http://domain.com时 ,我被redirect到http://www.domain.com/django.wsgi/ 。 浏览> http://www.domain.com工作得很好。

我在configuration中丢失了什么? 谢谢。

更新:我改变了RewriteRule

 RewriteRule ^django.wsgi/(.*)$ domain.com/$1 [L,R=301]. 

这个改变解决了这个问题。 如果有人能详细说明为什么/django.wsgi/部分在URL中结束,我将不胜感激。 谢谢!

你原来的重写规则可能会让事情混淆,因为匹配的$ 1模式已经有了一个'/',因此你创build了一个双斜杠。 如果你使用:

 RewriteRule ^(.*)$ http://www.domain.com$1 [QSA,L,R=301] 

并删除您的额外规则?


更新1

你误解了我的意思。 我不是在谈论你的解决方法,而是原来的规则。

为了更明显地表明你在做什么错误,哪些可能导致问题,请使用:

 RewriteEngine on RewriteCond %{HTTP_HOST} ^domain\.com$ [NC] RewriteRule ^/(.*)$ http://www.domain.com/$1 [L,R=301] 

请注意我是如何明确列出子模式外的“/”。 只有这样做才可以在$ 1之前使用'/'。 如果你不这样做,你会得到重复的斜杠。

我也build议放弃QSA。 我在互联网上的其他地方看到的例子也不使用。

最后,你应该逃避“。 在匹配的主机名中,否则可以在技术上匹配除了文字“。”以外的东西。 以及。

所以,尝试一下。 如果仍然有问题,那么你应该启用重写模块日志logging,看看是怎么回事。 您的configuration中可能有其他一些重写规则,这些规则会导致问题。


更新2

嗯,终于意识到你的实际问题是,你有目录指令容器内的重写规则,而不是在外面。

因此,将重写规则立即移到VirtualHost内部而不是Directory指令。

这是因为您的Web服务器将SCRIPT_NAME设置为“django.wsgi”。 如果将FORCE_SCRIPT_NAME =“”添加到settings.py中,则应该可以不使用RewriteRule。

http://docs.djangoproject.com/en/dev/ref/settings/#force-script-name