1

如果 URL 包含当前系统区域设置不支持的 UTF-8 编码字符,则 IIS 似乎错误地将请求 URL 传递到 Web 应用程序。所有“不受支持的”字符都被问号 ('?') 替换。

示例:系统区域设置为挪威语。以下 URL 工作正常:

/myapp/Blåbærsyltetøy/

以下网址无效:

/myapp/черничный-джем/

在这两个 URL 中,非 ASCII 字符被编码为 UTF-8,然后进行百分比编码,因此实际的 URL 如下所示:

/myapp/Bl%C3%A5b%C3%A6rsyltet%C3%B8y/
/myapp/%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D1%87%D0%BD%D1%8B%D0%B9-%D0%B4%D0%B6%D0%B5%D0%BC/

该应用程序使用两种处理请求的方式:

  • wfastcgi + Python
  • ISAPI + C++

两者都遇到同样的问题,如果 URL 仅包含系统语言环境支持的字符,则两者都没有问题。

在 ISAPI 的情况下,它看起来EXTENSION_CONTROL_BLOCK::lpszPathInfo已经提供了一个百分比解码的 URL,其中所有“不受支持的”字符都已被问号替换。该EXTENSION_CONTROL_BLOCK::lpszPathInfo属性是一个多字节字符串,并且没有这种结构的宽字符串版本。

有没有办法获取原始的百分比编码 URL 或阻止 IIS 解码 URL 以解决问题?

4

1 回答 1

0

ISAPI 解决方案

从服务器变量HTTP_URL而不是PATH_INFO. 这提供了原始的百分比编码 URL,然后可以正确解码(通过百分比解码为字节数组并将该字节数组解释为 UTF-8 编码字符串)。

该变量包含查询字符串和 URL 重写之前的原始路径,这可能是不需要的,因此可能需要一些额外的处理。

此外,对于错误处理程序请求,此变量包含格式类似于

<DLL_PATH>?<STATUS_CODE>;<ORIGINAL_HTTP_URL>

需要解析。但它包含所有包含的信息PATH_INFO,除了没有错误解码。

注意:Path_INFO使用GetServerVariable, 而不是从EXTENSION_CONTROL_BLOCK结构中获取并不能解决编码问题。

wfastcgi的解决方案

服务器变量默认使用系统语言环境('mbcs'在 Python 中调用)进行编码。可以通过设置注册表项来更改此行为:

reg add HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\w3svc\Parameters /v FastCGIUtf8ServerVariables /t REG_MULTI_SZ /d REQUEST_URI\0PATH_INFO

请注意,这将影响同一服务器上的所有 wfastcgi 应用程序,并可能破坏不期望变量为 UTF-8 编码的现有应用程序(不太可能,因为任何使用非 ASCII URL 的正常应用程序都将使用 UTF-8 编码。 ..)。

另请参阅https://support.microsoft.com/en-us/help/2277918/fix-a-php-application-that-depends-on-the-request-uri-server-variable

于 2017-10-19T11:03:37.567 回答