1

我们最近遇到了这样一种情况,即遍历字符串(例如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: {}\n\n'.format(environ['HTTP_HOST']).encode('utf-8')

    chars = list(environ['HTTP_HOST'])
    body += 'Host by char: {}\n\n'.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']

我们使用其他迭代字符串的方法得到相同的结果,比如 for 循环或列表推导,或者仅使用len().

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

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

4

1 回答 1

1

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

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

于 2020-07-22T14:28:11.693 回答