我正在尝试设置我的 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://域名.com,我被重定向到 >http://www.domain.com/django.wsgi/. 浏览至 >http://www.domain.com工作正常。
我的配置中是否缺少了什么?谢谢。
更新:我将 RewriteRule 更改为
RewriteRule ^django.wsgi/(.*)$ domain.com/$1 [L,R=301].
此更改解决了该问题。如果有人能详细说明为什么 /django.wsgi/ 部分最终出现在 URL 中,我将不胜感激。谢谢!
答案1
您原来的重写规则可能会造成混淆,因为匹配的 $1 模式中已经有一个 '/',因此您创建了一个双斜杠。如果您使用:
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”之前使用“/”才没问题。如果不这样做,您将得到重复的斜线。
我还建议放弃 QSA。我在互联网上其他地方看到的示例也没有使用它。
最后,您应该对匹配的主机名中的“。”进行转义,否则从技术上讲也可以匹配除文字“。”之外的其他内容。
所以,试试吧。如果仍然有问题,那么您应该启用重写模块日志记录并查看发生了什么。您的配置中可能存在一些其他重写规则,这些规则导致了问题。
更新2
嗯,终于意识到你的实际问题是重写规则在 Directory 指令容器内部而不是外部。
因此,将重写规则移至 VirtualHost 内部而不是 Directory 指令。
答案2
发生这种情况是因为您的 Web 服务器将 SCRIPT_NAME 设置为“django.wsgi”。如果将 FORCE_SCRIPT_NAME="" 添加到您的 settings.py,则无需使用 RewriteRule 即可。
http://docs.djangoproject.com/en/dev/ref/settings/#force-script-name