2015-09-22 2 views
3

Использование Django на сервере с Gunicorn, каждый раз, когда я отправляю форму и должен быть отправлен на адрес example.com/pagetwo, я отправляется на номер localhost/pagetwo.Почему Nginx продолжает перенаправлять меня на localhost?

Я новичок в Nginx, так что если кто-то может указать на то, что проблема в том, что я наиболее благодарен :)

default.conf:

server { 
    listen  80; 
    server_name example.com; 

    location /static/ { 
     root /srv; 
    } 

    location/{ 
     proxy_redirect off; 
     proxy_pass http://unix:/srv/sockets/website.sock; 
    } 

    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html; 
    } 
} 

Вот форма из индекса страница:

<form id='formone' method='POST' action=''> {% csrf_token %} 
    {{ form.as_p }} 
    <br /> 
    <button type="submit" class="btn btn-success btn-sm">Submit</button> 
</form> 
+0

Действительно ли действие действует на вашей форме? – cdvv7788

+0

Я добавил тег формы с главной страницы для справки – derrend

+0

Предполагаю, вы можете получить example.com/pagetwo с запросом на получение? Вы изменяете свой файл hosts? – cdvv7788

ответ

10

в этой ситуации, Джанго слушает на некотором Сокете и все запросы, отправленные на Джанго по Nginx являются локальными, так что хозяин Джанго видит это «локальный».

Django должен создать полный URL-адрес для любого перенаправления при отправке формы. Поскольку только домен django знает о «localhost», django будет создавать URL-адрес с помощью этого хоста.

Nginx используется как шлюз между django и клиентами, поэтому он отвечает за изменение всех URL-адресов перенаправления, отправленных django, чтобы соответствовать доменному имени, на котором работает сайт nginx. Но линия:

 proxy_redirect off; 

говорит Nginx «не делай этого, не переписать, что перенаправления URL-адреса». Это вызывает проблему перенаправления.

Что вы можете сделать: удалить эту строку или изменить конфигурацию nginx так, чтобы она правильно информировала django о доменном имени. Чтобы сделать это, вы должны добавить строку:

 proxy_set_header Host $http_host; 

С этой строки в конфиге, Nginx будет проходить реальное доменное имя Джанго вместо передачи Localhost. Это рекомендуется, потому что с этой линией nginx будет более прозрачной для django. Существуют также другие строки конфигурации заголовков, которые вы должны добавить здесь, поэтому другие вещи в django могут работать исправно. Список всех конфигураций см. В документации на сервер wsgi, который вы используете, для пушки, это будет here.

+1

Спасибо, что решил мою проблему :) Я просто хочу отметить, что в этом случае строка 'proxy_redirect off' была добавлена ​​после того, как я впервые запустил проблему, которая была там без нее. Добавление 'proxy_set_header Host $ http_host;' было решением. Еще раз спасибо :) – derrend

+0

Да, мое плохое. Удаление «proxy_redirect off» будет способствовать только в том случае, если вы не используете сокет unix, в UNIX-сокетах это ничего не изменит. О том, чтобы не получать IP-адрес клиента, вы должны добавить в свою конфигурацию nginx: 'proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;'. – GwynBleidD

+0

Еще раз спасибо, я нашел IP-конфигурацию в ссылке nginx doc, которую вы дали в ответ. Kudos good sir :) – derrend

Смежные вопросы