导致百分号的非ascii字符在django中被双重编码

时间:2015-12-10 22:45:18

标签: python django nginx gunicorn

我甚至不知道问题出在哪里,所以我会给你全部背景知识。

我在我的Linux服务器上设置了一个django应用程序,有nginx和gunicorn,并以玩具为例开始。

这是urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^(.*)/', views.helloworld),
    url(r'^$', views.homepage),
]

这里是views.py

from django.shortcuts import render
from django.http import HttpResponse

def helloworld(request, string):
    return HttpResponse("Hello World! " + string)

def homepage(request):
    return HttpResponse("Homepage!")

对于我正在处理的应用程序,我必须能够处理URL中的非ascii字符,因此我通过访问进行了测试。使用./manage.py runserver,一切都按预期工作:我被重定向到/é/(带有斜杠),然后打印出“Hello World!é”。

但是,当我在服务器上部署它时,行为会发生变化。如果我使用尾部斜杠访问/é/,我会得到“Hello World!%C3%A9”,而不会解码百分比编码。好吧,我不知道为什么行为不同,但我可以忍受。

如果我访问但没有斜杠,那么当添加尾部斜杠时,我会被重定向到/%25C3%25A9/,百分号本身会被双重编码。我想避免%25,但我不知道是谁添加它们,或者如何禁用它。

请帮忙吗?

如果有帮助,这里是nginx配置(相关部分):

upstream app_server_2 {
    server 127.0.0.1:7000 fail_timeout=0;
}

server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html;
    index index.html index.htm;

    [...]

    location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://app_server_2;
    }
}

0 个答案:

没有答案