我甚至不知道问题出在哪里,所以我会给你全部背景知识。
我在我的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;
}
}