我试图设置我的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