<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
<BR>
> Date: Thu, 21 Oct 2010 11:29:24 +0400<BR>> From: mdounin@mdounin.ru<BR>> To: nginx@nginx.org<BR>> Subject: Re: nginx doesn't handle different URL encodings well<BR>> <BR>> Hello!<BR>> <BR>> On Thu, Oct 21, 2010 at 03:23:46AM +0200, Pierre-Marie Baty wrote:<BR>> <BR>> > <BR>> > Hello Igor, hello all,<BR>> > <BR>> > Congratulations for your fantastic and neatly programmed web <BR>> > server. It's a pleasure to use it.<BR>> > <BR>> > I have a problem with nginx not serving files with accentuated <BR>> > characters when the sumbitted URL is UTF-8 encoded.<BR>> > <BR>> > Here is my nginx.conf : http://nginx.pastebin.com/aB7XRLM3 It's <BR>> > a home webserver that is primarily used to serve stuff like <BR>> > holiday photos.<BR>> > <BR>> > For example, I have a file called "été-2008.jpg" on my <BR>> > webserver. When I request http://myserver/été-2008.jpg, <BR>> > depending on whether the "Always send URLs as UTF-8" checkbox is <BR>> > checked or not in the Internet Explorer advanced options, the <BR>> > file is correctly served, or not.<BR>> > <BR>> > When the URL is Latin-1 encoded, the request sent is : GET <BR>> > /%e9t%e9-2008.jpg ----> nginx resolves this to "été-2008.jpg", <BR>> > the file is served, OK<BR>> > When the URL is UTF-8 encoded, the request sent is : GET <BR>> > /%C3%A9t%C3%A9-2008.jpg ----> nginx resolves this to <BR>> > "été-2008.jpg", and the file is not served. (file not found)<BR>> ><BR>> > Shouldn't a fallback mechanism be implemented so that when a <BR>> > file isn't found after an URL has been decoded, a second try is <BR>> > made with another encoding ? I believe two RFCs are involved : <BR>> > rfc2396 and rfc3986 (info given by PiotrSikora on IRC). IMO, <BR>> > nginx shouldn't assume the URL it gets are always following the <BR>> > same RFC. From what I know, this ambiguity is resolved in <BR>> > Apache. Maybe they have that sort of fallback mechanism.<BR>> <BR>> The only (related to the question) difference between RFC2396 and <BR>> RFC3986 is that later one recommends using UTF-8 for new URI <BR>> schemes. There is no ambiguity between the two: character set for <BR>> non-US-ASCII characters in http URLs isn't defined (though most <BR>> browsers nowadays use UTF-8 by default).<BR>> <BR>> The only solution is to provide correct URLs, i.e. already <BR>> encoded ones.<BR>> <BR>> If you think that "fallback mechanism" is a good idea - you may <BR>> implement one with "try_files" directive and embedded perl module <BR>> to do recoding between Latin1 and UTF-8. Note though that this <BR>> may lead to unexpected results: "/%C3%A9" may be Latin1 "/é" as <BR>> well as UTF-8 "/é".<BR><BR>
Yes, it makes sense. But shouldn't nginx assume a UTF-8 encoding instead of assuming a Latin-1 one ? Since in the future all URI will adopt this encoding method. IMO a request like GET /%C3A9t%C3A9-2008.jpg should translate to /été-2008.jpg - and not the other way around, like it's the case currently.<BR>
<BR>
Currently nginx assumes URLs are encoded in Latin1, whereas it should assume they're UTF-8 first. Don't you think ?<BR>
<BR>
-- <BR>
Pierre-Marie Baty<BR>                                            </body>
</html>