Сломанная перезапись URL при настройке Django/modwsgi

Я пытаюсь настроить приложение Django для работы под Apache с modwsgi. Я определил следующий виртуальный хост:

<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/, меня перенаправляют на> http://www.domain.com/django.wsgi/. Просмотр на> http://www.domain.com/ работает просто отлично.

Я что-то упустил в моей конфигурации? Благодарю.

Обновление: я изменил RewriteRule на

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

Это изменение устраняет проблему. Я буду признателен, если кто-нибудь сможет объяснить, почему часть /django.wsgi/ попадает в URL. Спасибо!

2 ответа

Решение

Ваше первоначальное правило перезаписи, вероятно, запутало вещи, потому что шаблон $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.

Это происходит потому, что ваш веб-сервер устанавливает для параметра SCRIPT_NAME значение "django.wsgi". Если добавить FORCE_SCRIPT_NAME="" в файл settings.py, вы сможете обойтись без RewriteRule.

http://docs.djangoproject.com/en/dev/ref/settings/

Другие вопросы по тегам