python - 为什么我的 WSGI 应用总是在 environ ['PATH_INFO' ] 中获取 URL 解码路径?

标签 python python-3.x wsgi

我有一个简单的裸 WSGI 应用程序:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    print('PATH_INFO:', environ['PATH_INFO'])
    return [b'<p>Hello World</p>']

if __name__ == '__main__':
    from wsgiref import simple_server
    server = simple_server.make_server('0.0.0.0', 8080, application)
    server.serve_forever()

我提出两个要求:

C:\>curl "http://localhost:8080/<foo>"
<p>Hello World</p>
C:\>curl "http://localhost:8080/%3Cfoo%3E"
<p>Hello World</p>

我得到这个输出:

C:\code>python foo.py
PATH_INFO: /<foo>
127.0.0.1 - - [09/Mar/2014 13:48:39] "GET /<foo> HTTP/1.1" 200 18
PATH_INFO: /<foo>
127.0.0.1 - - [09/Mar/2014 13:48:47] "GET /%3Cfoo%3E HTTP/1.1" 200 18

看看我的应用程序如何获取URL解码路径/<foo>即使客户请求 /%3Cfoo%3E .

它表明 wsgiref.simple_server 确保我的应用程序始终获得 environ['PATH_INFO'] 中的 URL 解码路径.

但是我在 PEP-3333 的任何地方都找不到这种行为的记录。能否请您指出记录此行为的官方文档?

最佳答案

来自实际 HTTP 请求行的 REQUEST_URI 的值,如果服务器使其可用,则为:

REQUEST_URI: '/%3Cfoo%3E'

即使您使用过,也可能是这种情况:

curl "http://localhost:8080/<foo>"

因为 curl 会在发送之前对 URL 进行编码以使用 % 转义符。

我认为 REQUEST_URI 不包含在任何 RFC 中,而是许多服务器提供的变量。但是你不能依赖它的存在,所以不要编写你的 WSGI 应用程序来依赖它的存在。

Web 服务器将在处理 REQUEST_URI 之前解码 % 转义。因此,最终在 PATH_INFO 中的结果将始终是:

PATH_INFO: '/<foo>'

解码由 WSGI 构建的 CGI 和相关 RFC 涵盖。

例如:

关于python - 为什么我的 WSGI 应用总是在 environ ['PATH_INFO' ] 中获取 URL 解码路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22280010/

相关文章:

python - Isolation Forest 的 ROC 曲线

python - Sublime Text 3 输出 Python

Python - 如何将 Panda 中的元素从列表转换为字符串

python-3.x - 在Docker容器和主机之间同步文件

python:解析带文件上传和附加参数的 HTTP POST 请求

python - WSGI:从应用程序返回的可迭代对象可以从不同的线程迭代吗?

python - Keras Conv2d(3 ,64, 3, 1) 是什么意思?

python - 绘制直方图以找出图像上梯度的最大强度

python 3 : matplotlib plotting four lines with dictionary

Python Flask 应用程序管理器