Problem with filename encoding

Hello list,

I got an issue with a filename containing “strange” characters.
It seems that nginx is not able to url_decode correctly, and then get
the
right file.

Yes, the filename is ugly : “Capture dcran 2010-09-25 08.30.07.png”
but apache is able to read it, and nginx is not :

nginx strace :
open("//images/Capture%20d%E2%80%99%C3%A9cran%202010-09-25%20%C3%A0%2008.30.07.png",
O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)

apache strace :
open("//images/Capture d\342\200\231\303\251cran 2010-09-25
\303\240
08.30.07.png", O_RDONLY|O_CLOEXEC) = 100

So it seems that nginx is using the url_encoded version of the filename,
while apache do it’s own thing on it.

On both apache and nginx, the access log says : “GET
/images/Capture%20d%E2%80%99%C3%A9cran%202010-09-25%20%C3%A0%2008.30.07.png”

both server have the same locales settings, and I tried different
charset
configuration into nginx, but no luck…

Any idea how I can fix that without changing the filename (sadly, it’s
not
possible :/) ?

Thanks
Nilshar

On Nov 13, 2012, at 12:32 , Nilshar wrote:

apache strace :
open("//images/Capture d\342\200\231\303\251cran 2010-09-25 \303\240
08.30.07.png", O_RDONLY|O_CLOEXEC) = 100

So it seems that nginx is using the url_encoded version of the filename, while
apache do it’s own thing on it.

On both apache and nginx, the access log says : “GET
/images/Capture%20d%E2%80%99%C3%A9cran%202010-09-25%20%C3%A0%2008.30.07.png”

both server have the same locales settings, and I tried different charset
configuration into nginx, but no luck…

Any idea how I can fix that without changing the filename (sadly, it’s not
possible :/) ?

The most probably there is a rewrite in configuration which changes URI
to $request_uri.
nginx escapes URI if no one interferes.

On 13 November 2012 09:38, Igor S. [email protected] wrote:

The most probably there is a rewrite in configuration which changes URI to
$request_uri.
nginx escapes URI if no one interferes.


Igor S.
Technical Support for NGINX and NGINX Plus Software

Yes indeed, there is a rewrite !
got a tip on how to fix that ?

On 13 November 2012 10:01, Igor S. [email protected] wrote:

right file.
\303\240 08.30.07.png", O_RDONLY|O_CLOEXEC) = 100
Any idea how I can fix that without changing the filename (sadly, it’s

The general rule is to not use rewrites at all: they make configuration to
a mess.


Igor S.
Technical Support for NGINX and NGINX Plus Software

Hum… well ok, if I read it right, it is recommanded to use try_files
instead right ?
Problem is that it seems that try_files is not allowed inside a “if”…

Well… maybe someone will be able to point me a better conf, here what
I’m
trying to do :

    location ~ ^/(media|files|list|album|images)/ {
            root /;
            if ($host ~* "^(.)(.)(.*)\.example.com$") {
                    set $dir1 $1;
                    set $dir2 $2;
                    set $dir3 $3;
                    rewrite ^ /<path>/

www.example.com/$dir1/$dir2/$dir1$dir2$dir3$request_uri? break;
}
}

So I should be able to remove the if so try_files might be happy, but I
do
not know how to set the 3 dir w/o the if statement…
I tried several things, so far no luck.

Nilshar

On Nov 13, 2012, at 12:41 , Nilshar wrote:

both server have the same locales settings, and I tried different charset
configuration into nginx, but no luck…

Any idea how I can fix that without changing the filename (sadly, it’s not
possible :/) ?

The most probably there is a rewrite in configuration which changes URI to
$request_uri.
nginx escapes URI if no one interferes.

Yes indeed, there is a rewrite !
got a tip on how to fix that ?

The general rule is to not use rewrites at all: they make configuration
to a mess.

On 13 November 2012 10:41, Igor S. [email protected] wrote:

trying to do :
}


Igor S.
Technical Support for NGINX and NGINX Plus Software

Well… simple, clear and… works perfectly !
very hard to switch from an apache logic to a nginx logic, but I’ll
improve
:stuck_out_tongue:

Thanks a lot Igor !

Nilshar.

On Tue, Nov 13, 2012 at 10:22:53AM +0100, Nilshar wrote:

I got an issue with a filename containing “strange” characters.
apache strace :
configuration into nginx, but no luck…
Yes indeed, there is a rewrite !
Well… maybe someone will be able to point me a better conf, here what I’m
}
}

So I should be able to remove the if so try_files might be happy, but I do
not know how to set the 3 dir w/o the if statement…
I tried several things, so far no luck.

server {
server_name ~^(?.)(?.)(?.*).example.com$;

root /path/www.example.com/$dir1/$dir2/$dir1$dir2$dir3;

location /media/  { }
location /files/  { }
location /list/   { }
location /album/  { }
location /images/ { }

location / { return 404; }

}


Igor S.