英文:
Flask app deployed on IIS fails to handle unicode in URL
问题
@app.route("/api/<value>")
def foo(value):
...
在我的本地机器上,使用Flask开发服务器,一切都正常。
但是在生产环境中,应用程序部署在IIS上,使用wfastcgi
,当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
包中的quote
和unquote
方法,但似乎没有解决问题。
是否有任何IIS设置可以解决这个问题?
(IIS 10,Flask 1.1.2)
<details>
<summary>英文:</summary>
I have a Flask app with a route defined like this:
```python
@app.route("/api/<value>")
def foo(value):
...
On my local machine, using Flask development server, everything works correctly.
But on production, where the app is deployed on IIS using wfastcgi
, I get a 404 error when name
contains non-ascii characters. In IIS logs the route seems OK (shown on the log file as UTF-8) but on the Flask side the request is received with gibberish characters. The following method:
@app.before_request
def log_request():
req: flask.Request = request
logger.info(
f"{req.method} {req.path}}"
)
prints this to the log:
GET /api/�
This is more than just a display issue. The value itself is incorrect and I can't use it to process the request correctly.
I tried to use the quote
and unquote
methods from the urllib
package but it does not seem to solve the problem.
Is there any setting on IIS I can use to fix this?
(IIS 10, Flask 1.1.2)
答案1
得分: 0
我在Microsoft关于PHP与FastCGI的文档中找到了以下内容。对于Flask/wfastcgi,这也适用于我:
默认情况下,FastCGI扩展在设置PHP使用的服务器变量时使用ASCII编码。当请求的URL包含非ASCII字符时,从请求的URL字符串派生其值的服务器变量可能被设置不正确。依赖这些服务器变量的PHP应用可能因此而无法正常工作。
为了防止这种情况发生,可以配置FastCGI扩展在设置服务器变量时使用UTF-8编码。要为特定一组服务器变量配置FastCGI以使用UTF-8编码,可以使用REG_MULTI_SZ注册表键FastCGIUtf8ServerVariables,并将其值设置为服务器变量名称的列表。例如:
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。
英文:
I found the following on Microsoft's documentation for PHP with FastCGI. I worked for me with Flask/wfastcgi as well:
> By default, the FastCGI extension uses ASCII encoding when setting server variables that are used by PHP. When the requested URL contains non-ASCII characters, server variables that derive their values from the requested URL string may be set incorrectly. PHP applications that rely on those server variables may not work as a result.
>To prevent this, the FastCGI extension can be configured to use UTF-8 encoding when setting server variables. To configure FastCGI to use UTF-8 encoding for a particular set of server variables, use the REG_MULTI_SZ registry key FastCGIUtf8ServerVariables and set its value to a list of server variable names. For example:
>reg add HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\w3svc\Parameters /v FastCGIUtf8ServerVariables /t REG_MULTI_SZ /d REQUEST_URI\0PATH_INFO
>The above example configures the FastCGI extension to use UTF-8 encoding when setting the REQUEST_URI and PATH_INFO server variables.
>After setting the registry key, restart IIS by using the iisreset command.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论