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

страница на моем локальном хосте

http://127.0.0.1:8000/signin

А на сервере становится

http://xyz.com,%20xyz.com/signin

В Firebug я вижу

GET signin 301 MOVED PERMANENTLY
GET signin http://xyz.com,%20xyz.com/signin

Я верю, что это происходит потому, что urls.py имеет ^ signin / $ ^ и APPEND_SLASH = True в settings.py, потому что, когда я захожу в / signin /, он работает!


Страница 404 на моем локальном хосте

Request URL:    http://127.0.0.1:8000/test

На сервере

Request URL:    http://xyz.com,%20xyz.com/test

По какой-то причине он добавляет [запятую] [пробел] к URL-адресу и перенаправляет его.


Домашняя страница работает без проблем

0
Nour Wolf 29 Авг 2011 в 14:26

2 ответа

Лучший ответ

Проблема отслеживается в следующем тикете:
https://code.djangoproject.com/ticket/11877

Это связано с тем, как Django обрабатывает перенаправление прокси. Следующее промежуточное ПО поможет вам.

class MultipleProxyMiddleware(object):
    FORWARDED_FOR_FIELDS = [
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED_HOST',
        'HTTP_X_FORWARDED_SERVER',
    ]

    def process_request(self, request):
        """
        Rewrites the proxy headers so that only the most
        recent proxy is used.
        """
        for field in self.FORWARDED_FOR_FIELDS:
            if field in request.META:
                if ',' in request.META[field]:
                    parts = request.META[field].split(',')
                    request.META[field] = parts[-1].strip()

Если, например, ваш сайт Django находится за прокси-сервером, который включает информацию о прокси в заголовке X-Forwarded-For, а затем ваш веб-сервер также выполняет проксирование, заголовок будет содержать список (через запятую) прокси-адресов. Используя это промежуточное программное обеспечение, он удаляет все прокси-адреса, кроме одного, в заголовках.

3
Community 30 Ноя 2011 в 18:53

Возможно, это не ответ, так как я работаю с вами над одним приложением, я его исправил.

Это как-то связано с перенаправлением nginx на apache, у нас был proxy_set_header Host $host;, и когда я отключил его, перенаправление работало без ошибок.

1
mpcabd 29 Авг 2011 в 12:28