Codificación NGINX, FastCGI, UTF-8: Salida iso-8859-1 en lugar de utf8

Espero que pueda darme una idea de lo que está saliendo mal.

El Szenario: ejecuto gitweb (CGI) con un script en modo fastcgi:

#!/bin/sh
export FCGI_SOCKET_PATH=127.0.0.1:7001
su git -c "/var/www/vh_[vhost]/htdocs/gitweb.cgi --fastcgi &"

Luego uso nginx para servir ese contenido:

...
fastcgi_pass 127.0.0.1:7001; 
...

Todo funciona como se esperaba, pero aquí está el problema:

$ wget "http://git.[host].de/?p=[repo].git;a=summary" -O /tmp/test.txt && file --mime-encoding /tmp/test.txt
> /tmp/test.txt: iso-8859-1



$ su git -c "./gitweb.cgi \"?p=[repo].git;a=summary\" > ./test" && file --mime-encoding ./test 
> ./test: utf-8

Lo que obviamente significa que la salida de fast-cgi es utf8 mientras que el contenido proporcionado por nginx es iso-8859-1.

Encabezado de respuesta de FireBugs:

Server  nginx
Date    Fri, 02 Sep 2011 14:14:08 GMT
Content-Type    application/xhtml+xml; charset=utf-8
Transfer-Encoding   chunked
Connection  close

Parece que la transferencia mediante el socket conduce a un problema de codificación.
He probado mucho, pero no sé cómo resolverlo.

preguntado el 02 de septiembre de 11 a las 14:09

También veo este problema con nginx: Z rich en lugar de Zürich ... ¡esperando una respuesta! -

según mi siguiente ... intente agregar el juego de caracteres -

2 Respuestas

aunque no está usando PHP, encontré la solución para mi problema, pero envolviendo las piezas que estaban expuestas como ISO-8859-1 con: utf8_encode(): http://php.net/manual/en/function.utf8-encode.php

Si su CGI está en PERL, tal vez http://perldoc.perl.org/utf8.html resolverá tu problema. Resolvió el mío ... Z rich

Otra opción podría ser agregar lo siguiente al http { } declaración en su nginx.conf:

 charset utf-8;

-Dakota del Sur

Respondido el 23 de Septiembre de 11 a las 21:09

Thx, pero utf8_encode () fue el primero que probé: / En realidad, el script perl produce utf8 válido, el problema es que nginx no sirve la codificación utf8 sino ISO-8859-1, solo en ese script, otros como php vía fastcgi se sirven correctamente. - blang

¿Qué versión de nginx? intente 1.0.x? - sdolgy

Puedo hacer que funcione usando fcgiwrap.

Pensé que algunas variables de entorno eran diferentes entre los dos métodos, así que agregué el siguiente código al gitweb.cgi dispatch() sub:

        open my $tmplogfile, ">", "/tmp/gitweb-env.txt";
        foreach my $varkey (sort keys %ENV) {
                print $tmplogfile "$varkey = $ENV{$varkey}\n";
        }
        close $tmplogfile;

pero el ambiente era el mismo.

Algo puede ser hecho por fcgiwrap, Todavía no he encontrado qué.

Estos son los comandos que uso y las diferencias que encontré al usar tcpdump en el zócalo fcgi:

# gitweb spawned by fcgiwrap outputs utf-8
/usr/bin/spawn-fcgi -d /usr/share/gitweb -a 127.0.0.1 -p 3000 -u www-data -g gitolite -P /run/gitweb/gitweb.cgi.pid -- /usr/sbin/fcgiwrap

# Require the following nginx gitweb_fastcgi_params
# fastcgi_param   QUERY_STRING            $query_string;
# fastcgi_param   REQUEST_METHOD          $request_method;
# fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
# fastcgi_param   DOCUMENT_ROOT           $document_root;

# With the following nginx configuration
# upstream gitweb {
#     server 127.0.0.1:3000;
# }
# 
# server {
#         listen   80;
# 
#         server_name git.example.net;
#
#         root /usr/share/gitweb;
#
#         access_log /var/log/nginx/gitweb-access.log;
#         error_log /var/log/nginx/gitweb-errors.log;
# 
#         location / {
#                 alias /usr/share/gitweb/gitweb.cgi;
#                 include gitweb_fastcgi_params;
#                 fastcgi_pass gitweb;
#         }
# 
#         location /static {
#                 alias /usr/share/gitweb/static;
#                 expires 31d;
#         }
# }

# STDOUT captured on lo
# Begin of the FCGI answer
#    00000000  01 06 00 01 1f f8 00 00  53 74 61 74 75 73 3a 20 ........ Status: 
#    00000010  32 30 30 20 4f 4b 0d 0a  43 6f 6e 74 65 6e 74 2d 200 OK.. Content-
#    00000020  54 79 70 65 3a 20 61 70  70 6c 69 63 61 74 69 6f Type: ap plicatio
#    00000030  6e 2f 78 68 74 6d 6c 2b  78 6d 6c 3b 20 63 68 61 n/xhtml+ xml; cha
#    00000040  72 73 65 74 3d 75 74 66  2d 38 0d 0a 0d 0a 3c 3f rset=utf -8....<?
#    00000050  78 6d 6c 20 76 65 72 73  69 6f 6e 3d 22 31 2e 30 xml vers ion="1.0
#    [...]
#
# "Guido Günther" as UTF-8
#    00000FA0  6c 65 3d 22 53 65 61 72  63 68 20 66 6f 72 20 63 le="Sear ch for c
#    00000FB0  6f 6d 6d 69 74 73 20 61  75 74 68 6f 72 65 64 20 ommits a uthored 
#    00000FC0  62 79 20 47 75 69 64 6f  20 47 c3 bc 6e 74 68 65 by Guido  G..nthe
#    00000FD0  72 22 20 63 6c 61 73 73  3d 22 6c 69 73 74 22 20 r" class ="list" 

Antes, gitweb --fastcgi fue generado directamente por spawn-fcgi:

# gitweb spawned by spawn-fcgi outputs iso-8859-1
/usr/bin/spawn-fcgi -d /usr/share/gitweb -a 127.0.0.1 -p 3000 -u www-data -g gitolite -P /run/gitweb/gitweb.cgi.pid -- /usr/share/gitweb/gitweb.cgi --fastcgi

# STDOUT captured on lo
# Begin of the FCGI answer with "00 46 02" in place of "1f f8 00" for utf-8 output
#    00000000  01 06 00 01 00 46 02 00  53 74 61 74 75 73 3a 20 .....F.. Status: 
#    00000010  32 30 30 20 4f 4b 0d 0a  43 6f 6e 74 65 6e 74 2d 200 OK.. Content-
#    00000020  54 79 70 65 3a 20 61 70  70 6c 69 63 61 74 69 6f Type: ap plicatio
#    00000030  6e 2f 78 68 74 6d 6c 2b  78 6d 6c 3b 20 63 68 61 n/xhtml+ xml; cha
#    00000040  72 73 65 74 3d 75 74 66  2d 38 0d 0a 0d 0a 00 00 rset=utf -8......
#    00000050  01 06 00 01 02 88 00 00  3c 3f 78 6d 6c 20 76 65 ........ <?xml ve
#    00000060  72 73 69 6f 6e 3d 22 31  2e 30 22 20 65 6e 63 6f rsion="1 .0" enco
#    00000070  64 69 6e 67 3d 22 75 74  66 2d 38 22 3f 3e 0a 3c ding="ut f-8"?>.<
#    [...]
#
# "Guido Günther" as ISO-8859-1
#    00001128  74 6c 65 3d 22 53 65 61  72 63 68 20 66 6f 72 20 tle="Sea rch for 
#    00001138  63 6f 6d 6d 69 74 73 20  61 75 74 68 6f 72 65 64 commits  authored
#    00001148  20 62 79 20 47 75 69 64  6f 20 47 fc 6e 74 68 65  by Guid o G.nthe

Respondido 09 ago 13, 18:08

gracias por su respuesta, pero no puedo verificar que después de tanto tiempo, tal vez alguien más pueda verificar esta solución. - blang

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.