如果URL包含UTF-8編碼字符(它不受當前系統區域設置支持),IIS似乎錯誤地將請求URL傳送到Web應用程序。所有「不支持」的字符都被問號('?')取代。IIS錯誤地解碼了包含系統區域外部字符的URL
示例:系統語言環境設置爲挪威語。 以下網址工作正常:
/myapp/Blåbærsyltetøy/
以下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來解決問題?
請參見ISAPI,解決的辦法是從服務器變量'HTTP_URL'獲取URL,而不是'PATH_INFO'。這提供了原始的百分比編碼的URL,然後可以正確解碼。在wfastcgi腳本中,「HTTP_URL」不可用,並且嘗試在Python中訪問它會導致「KeyError」。 –
爲wfastcgi嘗試了此變通辦法:https://support.microsoft.com/zh-cn/help/2277918/fix-a-php-application-that-depends-on-the-request-uri-server-variable - 結果:網址不再包含問號。相反,它們包含百分比編碼的字節,在解釋爲UTF-8時會變成亂碼。 –
更正我以前的評論:此處描述的修補程序和註冊表變量https://support.microsoft.com/en-us/help/2277918/fix-a-php-application-that-depends-on-the-request- uri-server-variable實際上解決了wfastcgi的問題。 –