Django请求URL变得奇怪

Django Request URL becomes weird

我在本地主机上运行了一个django项目,它运行得很好,但是当我将其上传到真实服务器时,URL出现了一些问题。每当HttpResponseRedirect或任何重定向被称为

时,它都会发生

本地主机上的页面

1
http://127.0.0.1:8000/signin

在服务器上时变为

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

在萤火虫中,我看到了

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

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

我的本地主机上的

404页面

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

在服务器上

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

由于某种原因,它在网址中添加了[逗号] [空格]并对其进行了重定向。

主页正常运行


在以下票证中跟踪了该问题:
https://code.djangoproject.com/ticket/11877

这与Django处理代理重定向的方式有关。以下中间件将帮助您。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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服务器也进行代理,则标头将包含列表的列表(以逗号分隔)。代理地址。通过使用此中间件,它将剥离标头中除一个代理地址以外的所有地址。


这可能不是一个答案,因为我正在与您一起使用同一应用程序,因此我对其进行了修复。

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