Сломанная перезапись 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.