Es scheint, dass IIS die Anforderungs-URL fälschlicherweise an eine Webanwendung liefert, wenn die URL UTF-8-codierte Zeichen enthält, die vom aktuellen Systemgebietsschema nicht unterstützt werden. Alle "nicht unterstützten" Zeichen werden durch Fragezeichen ('?') Ersetzt.IIS dekodiert fälschlicherweise URLs, die Zeichen außerhalb des Systemgebiets enthalten
Beispiel: Das Systemgebietsschema ist auf Norwegisch eingestellt. Die folgende URL funktioniert:
/myapp/Blåbærsyltetøy/
Die folgende URL nicht funktioniert:
/myapp/черничный-джем/
In beiden URLs werden nicht-ASCII-Zeichen codiert als UTF-8 und dann Prozent-codiert, so dass die tatsächlichen URLs wie folgt aussehen:
/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/
Die Anwendung nutzt zwei Wege im Umgang mit Anfragen:
- wfastcgi + Python
- ISAPI + C++
Beide sind unter dem gleichen Problem leiden, und beide haben kein Problem, wenn die URL nur Zeichen enthält, die vom System unterstützt werden locale.
Im Falle von ISAPI sieht es so aus, als ob EXTENSION_CONTROL_BLOCK::lpszPathInfo
bereits eine prozent-decodierte URL liefert, wo alle "nicht unterstützten" Zeichen durch Fragezeichen ersetzt wurden. Das EXTENSION_CONTROL_BLOCK::lpszPathInfo
Attribut ist eine Multi-Byte-Zeichenfolge, und es gibt keine Breitzeichenkettenversion dieser Struktur.
Gibt es eine Möglichkeit, die ursprüngliche, prozentcodierte URL zu erhalten oder zu verhindern, dass IIS URLs entschlüsselt, um das Problem zu umgehen?
Für ISAPI Siehe, ist die Lösung, die die URL von dem Server Variable 'HTTP_URL', anstatt' PATH_INFO' zu bekommen. Dies liefert die rohe, prozentcodierte URL, die dann korrekt dekodiert werden kann. In einem wfastcgi-Skript ist 'HTTP_URL' nicht verfügbar und der Versuch, in Python darauf zuzugreifen, führt zu 'KeyError'. –
Diese Problemumgehung für wfastcgi wurde versucht: https://support.microsoft.com/en-us/help/2277918/fix-a-php-application-that-depends-on-the-request-uri-server-variable - Result : URLs enthalten keine Fragezeichen mehr. Stattdessen enthalten sie prozentcodierte Bytes, die bei der Interpretation als UTF-8 zu einem Kauderwelsch werden. –
Korrektur zu meinem vorherigen Kommentar: Die hier beschriebene Hotfix- und Registry-Variable https://support.microsoft.com/en-us/help/2277918/fix-a-php-application-that-depend-on-the-request- uri-server-variable löst das Problem für wfastcgi. –