Django постоянно меняет URL с http://localhost/ на http://127.0.0.1:8080/ - PullRequest
4 голосов
/ 29 марта 2011

Как было сказано в заголовке, Django продолжает изменять мой URL с /localhost/ на /127.0.0.1:8080/, что постоянно портит мои обслуживающие статические файлы Nginx. Любые идеи, почему это делает это? Спасибо!

/ ** EDIT ** / Вот конфигурация Nginx:

server {

    listen   80; ## listen for ipv4
    listen   [::]:80 default ipv6only=on; ## listen for ipv6

    server_name  localhost;

    access_log  /var/log/nginx/localhost.access.log;

    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
    {
            root   /srv/www/testing;
    }

    location / {
            proxy_pass         http://127.0.0.1:8080/;
            proxy_redirect     off;
    }

    location /doc {
        root   /usr/share;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

    location /images {
        root   /usr/share;
        autoindex on;
    }

Вот файл конфигурации Apache:

<VirtualHost *:8080>

    ServerName testing
    DocumentRoot /srv/www/testing

    <Directory /srv/www/testing>
        Order allow,deny
        Allow from all
    </Directory>

    WSGIScriptAlias / /srv/www/testing/apache/django.wsgi

</VirtualHost>

Ответы [ 3 ]

7 голосов
/ 29 декабря 2011

Если вы используете VirtualHost, вам нужно установить USE_X_FORWARDED_HOST = True в вашем settings.py

Вот ссылка: Django Doc для Settings.py

USE_X_FORWARDED_HOST Новое в Django 1.3.1: см. Примечания к выпуску

По умолчанию: False

Логическое значение, указывающее, использовать ли заголовок X-Forwarded-Host вместо предпочтенияЗаголовок хоста.Это следует включить, только если используется прокси, который устанавливает этот заголовок.

Вот пример кода:

import os, socket
PROJECT_DIR = os.path.dirname(__file__)

on_production_server = True if socket.gethostname() == 'your.productionserver.com' else False

DEBUG = True if not on_production_server else False
TEMPLATE_DEBUG = DEBUG

USE_X_FORWARDED_HOST = True if not on_production_server else False
4 голосов
/ 29 марта 2011

edit2:

http://wiki.nginx.org/HttpProxyModule#proxy_redirect

http://wiki.nginx.org/HttpProxyModule#proxy_pass

Я думаю, что происходит, когда вы используете httpresponseredirect,Заголовок HTTP_HOST дает ему 127.0.0.1:8080 из-за вашей настройки proxy_pass.

Кажется, что HttpResponseRedirect Джанго лишает мой поддомен?

У Django есть несколько методов, которые всегда применяются к ответу.Одним из них является django.utils.http.fix_location_header.Это гарантирует, что ответ на перенаправление всегда содержит абсолютный URI (как того требует спецификация HTTP).

1 голос
/ 27 мая 2011

Была такая же проблема (перенаправления django попали в браузер с добавлением ": 8080"). После дальнейших поисков я нашел некоторую информацию по nginx. Следующие исправили это ...

В вашей конфигурации nginx замените ...

  proxy_redirect    off;

с ....

  proxy_redirect   http://127.0.0.1:8080/ http://127.0.0.1/;

Не забудьте перезапустить демона nginx. Это приводит к тому, что nginx отбрасывает 8080 пакетов, передаваемых из apache обратно в браузер. Например, перенаправление из django через apache, http://127.0.0.1:8080/my/test/file.html станет http://127.0.0.1/my/test/file.html после того, как nginx отправит его обратно клиенту.

Теперь вам не нужно будет модифицировать код django.

...