一个字符串(取自python-wsgi环境)在对其字符进行迭代时会有什么不同



我们最近遇到一种情况,在字符串(例如list(some_string)(上迭代会得到与直接打印some_string完全不同的结果。这怎么会发生?

一些背景:我们使用wfastcgi在IIS上运行一个python web应用程序,应用程序服务器位于负载均衡器后面。应用程序服务器的内部主机和负载均衡器的外部主机出现在应用程序的不同部分时,我们遇到了一些问题,因此为了缩小范围,我们编写了一个小型wsgi服务器来查看内部到底传递了什么。

这是模块,再次在IIS上使用wfastcgi运行:

# test-wsgi.py
def application(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/plain; charset=utf-8')]
body = 'Host: {}nn'.format(environ['HTTP_HOST']).encode('utf-8')
chars = list(environ['HTTP_HOST'])
body += 'Host by char: {}nn'.format(chars).encode('utf-8')

start_response(status, headers)
return [body]

看,疯狂,这是回应:

Host: pretty-domain.com
Host by char: ['i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '.', 'h', 'o', 's', 't', '.', 'e', 'x', 'a', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm']

我们使用其他对字符串进行迭代的方法得到了相同的结果,比如循环或列表理解,或者只使用len()

除了是什么原因导致这些特定值出现在我们的设置中之外,这怎么会在python中发生呢?

这是在IIS 10、python 3.6.8和wfastcgi 3.0.0上。

在这里回答我自己:事实证明,问题完全在其他地方所有上面的变量都包含相同的字符串,即'internal.host.example.com'-是负载平衡器执行重写规则,将其转换为'pretty-domain.com',无论在响应中找到它。

这对我来说是一个警示,负载均衡器不仅可以修改请求,还可以修改响应。

最新更新