X-Accel-Redirect can't deal with un-ascii file name

wangzhenghang at routon.com wangzhenghang at routon.com
Thu Apr 7 14:28:27 MSD 2011

Hi, all!
I have some files with un-ascii name, and I want to use X-Accel-Redirect 
to control the download access. This is my nginx-conf:

server {
  listen          80; 
  server_name     update.grandes.com.cn;
  access_log  logs/grandes_access.log  main;
  location /update/download {
    rewrite ^/update/download/(.+)$ /update/download.action?path=$1 last;
    proxy_pass              http://localhost:8080;
    proxy_redirect off;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        Host $http_host;
    client_max_body_size 10240m;
    client_body_buffer_size 128k;

    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;

    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
  location /h3/ {
    root /usr/local/data;
    proxy_hide_header X-Accel-Redirect;
    add_header ETag $upstream_http_etag;

And this's the code of '/update/download.action' running in tomcat server, 

        public String file() {
                response.setHeader("X-Accel-Charset", "utf-8");
                response.setHeader("X-Accel-Redirect", path);

                return NONE;

When access the path 
nginx server report 500 Internal Server Error. Then I see the log, the 
tomcat server print the path parameter like this 'WH2HOSIPTV/日志.txt' 
which is right,
but the nginx log track like this;
2011/04/07 18:12:56 [crit] 2056#5500: *1 CreateFile() 
"/usr/local/data/WH2HOSIPTV/遄.txt" failed (1113: No mapping for the 
Unicode character exists in the target multi-byte code page), client:, server: update.grandes.com.cn, request: "GET 
/update/download/WH2HOSIPTV/%E6%97%A5%E5%BF%97.txt HTTP/1.1", upstream: 
host: "update.grandes.com.cn".

I try to run nginx and tomcat server both in Red Hat Enterprise Linux AS 
release 4 with environment variables LANG=zh_CN.UTF-8 and windows xp which 
charset is GBK, and try to change X-Accel-Charset to 'GBK', the nginx 
always report 500 error. The problem existes both in nginx-0.8.54 and 
nginx-0.9.6. But when I change the code in '/update/download.action' like 
this, it works fine! Is this a bug of nginx?

        public String file() {
                response.setHeader("X-Accel-Charset", "utf-8");
                response.setHeader("X-Accel-Redirect", new 
String(path.getBytes("utf-8"), "iso-8859-1"));

                return NONE;

Best regards
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx/attachments/20110407/16c96d21/attachment.html>

More information about the nginx mailing list