Django/modwsgi 设置中的 URL 重写损坏

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://域名.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

相关内容