IIS上部署的Flask应用程序无法处理URL中的unicode

vbopmzt1  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个Flask应用,它的路由定义如下:

@app.route("/api/<value>")
def foo(value):
    ...

在我的本地机器上,使用Flask开发服务器,一切正常。
但是在生产环境中,应用程序使用wfastcgi部署在IIS上,当name包含非ASCII字符时,我会收到404错误。在IIS日志中,路由似乎正常(在日志文件中显示为UTF-8),但在Flask端,接收到的请求带有乱码字符。以下方法:

@app.before_request
def log_request():
    req: flask.Request = request
    logger.info(
        f"{req.method} {req.path}}"
    )

将以下内容打印到日志:

GET /api/�

这不仅仅是一个显示问题。值本身不正确,我无法使用它来正确处理请求。
我尝试使用urllib包中的quoteunquote方法,但似乎无法解决问题。
在IIS上有什么设置可以用来解决这个问题吗?
(IIS 10,培养瓶1.1.2)

qvk1mo1f

qvk1mo1f1#

我在Microsoft的PHP with FastCGI文档中发现了以下内容。我也使用Flask/wfastcgi:
默认情况下,FastCGI扩展在设置PHP使用的服务器变量时使用ASCII编码。当请求的URL包含非ASCII字符时,从请求的URL字符串派生其值的服务器变量可能设置不正确。依赖于这些服务器变量的PHP应用程序可能无法正常工作。
为了防止这种情况,可以将FastCGI扩展配置为在设置服务器变量时使用UTF-8编码。要将FastCGI配置为对一组特定的服务器变量使用UTF-8编码,请使用REG_MULTI_SZ注册表项FastCGIUtf 8 ServerVariables并将其值设置为服务器变量名称列表。例如:
reg add HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\w3svc\Parameters /v FastCGIUtf8ServerVariables /t REG_MULTI_SZ /d REQUEST_URI\0PATH_INFO上面的示例配置FastCGI扩展在设置REQUEST_URI和PATH_INFO服务器变量时使用UTF-8编码。
设置注册表项后,使用iisreset命令重新启动IIS。

相关问题