Назад | Перейти на главную страницу

Перезапись битого 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-адрес. Спасибо!

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

Хммм, наконец-то понял, что ваша настоящая проблема в том, что у вас есть правило перезаписи внутри контейнера директив каталога, а не снаружи.

Итак, переместите правила перезаписи непосредственно в VirtualHost, а не в директиву Directory.

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

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