Django请求URL变得奇怪

时间:2011-08-29 10:26:20

标签: django url redirect request httpresponse

我有一个在我的localhost上运行的django项目,它运行得很好,但是当我将它上传到真实服务器时,一些问题开始发生在url上。每当HttpResponseRedirect或任何重定向被调用时都会发生这种情况

我本地主机上的一个页面

http://127.0.0.1:8000/signin

在服务器上它变为

http://xyz.com,%20xyz.com/signin
在萤火虫中我看到了

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

我相信这是因为urls.py在settings.py中有^ signin / $ ^和APPEND_SLASH = True,因为当我访问/ signin /它有效时!


我本地主机上的404页

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

在服务器上

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

由于某种原因,它将[逗号] [空格]添加到网址并重定向。


主页正常运行

2 个答案:

答案 0 :(得分:3)

在以下故障单中跟踪问题:
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标头中的代理信息的代理后面,然后您的Web服务器也进行代理,则标头将包含一个列表(以逗号分隔)代理地址。通过使用此中间件,它将删除标题中除一个代理地址之外的所有地址。

答案 1 :(得分:1)

这可能不是一个答案,因为我在同一个应用程序上与你合作,我修复了它。

它与nginx到apache重定向有关,我们有proxy_set_header Host $host;,当我禁用它时,重定向工作没有错误。