2012-08-08 2 views
1

왜 내가 nginx가 잘못된 인코딩으로 일부 정적 이미지를로드하려고하는지 알아 내려고합니다. 예 :Nginx : utf8 문자 인코딩 정적 파일

하는 error.log 가입일

:

2012년 8월 8일 21시 14분 46초 [오류] 17,968 # 0 * 71 열기() "/ 홈/WWW/사용자 도메인 .com/WEB-INF/images/productimage/image-ö¸.png " 실패 (2 : 해당 파일 또는 디렉토리 없음), 클라이언트 : xxxx, 서버 : www.mydomain.com, 요청 :"이미지/productimage/화상 - % C3 % B8.png HTTP/1.1 "호스트"www.mydomain.com "추천자 : "http://www.mydomain.com/ "

내 nginx.conf 파일에 다음을 추가했습니다.

source_charset utf-8; 
charset utf-8; 

그러나 불행히도, 그것은 그것을 해결하지 못했습니다.

내 가상 호스트 설정 파일은 다음을 사용하여 이미지 파일을 제공합니다.

location /images/ 
    { 
      alias /home/www/mydomain.com/WEB-INF/images/; 
      expires 15d; 
    } 

LANG 환경 변수를 그대로 사용하여 우분투를 사용하고 있습니다.

export LANG=en_US.UTF-8 
export LANGUAGE=en_US.UTF-8 
export LC_ALL=en_US.UTF-8 

실마리? 감사 !

답변

1

URI의 백분율 인코딩은 실제로 인코딩 단계가 아닌 인코딩의 두 단계입니다. 이상적으로, 첫 번째 텍스트는 UTF-8로 인코딩되며, UTF-8 텍스트는 "%의 인코딩은"이 같은 결과를 생산하는 URI에 사용되는 :

/images/productimage/image-%C3%B8.png 

이 URI가 가지고있는 확인할 수 있습니다 제대로 인코딩 되었습니까? 원하는 문자로 시작한 다음 UTF-8로 인코딩 한 다음 백분율로 인코딩하면 결과는 % C3 % B8입니까?

$perl -MCGI -e 'print CGI::escape("Hello World")."\n";' 
Hello%20World 

넣어하는 또 다른 방법 : 수동으로이 같은 퍼센트 인코딩 된 스크립트를 생성 할 수있는 문제가 Nginx에 의해 디코딩 에 당신의 확신, 아닌 인코딩? 이미지 참조를 포함하는 HTML 페이지의 인코딩을 확인하십시오. HTTP 헤더와 메타 태그를 모두 검토하십시오. UTF-8로 명시 적으로 선언해야합니다. 그렇지 않으면 브라우저가 참조를 잘못 해석 할 수 있습니다.

당신은 마찬가지로 수동으로 다음과 같이 디코딩 프로세스를 테스트 할 수 있습니다

perl -MCGI -e 'print CGI::unescape("/images/productimage/image-%C3%B8.png")."\n";' 
/images/productimage/image-ø.png 

을 그 기준으로 관심이 있다면 내가하는 detailed post about percent-encoding with Perl를 작성했습니다.

+0

안녕하십니까, 답장을 보내 주셔서 감사합니다. 마지막 명령 줄을 통해 perl을 통해 이스케이프 해제를 테스트했으며 perl은 /images/productimage/image-ø.png 대신 /images/productimage/image- productimage/image-ø.png, 당신의 제안이 옳다는 것을 알았습니다. /images/productimage/image-%F8.png 인코딩을 사용하면 이미지가로드됩니다. 그래서 perl/nginx의 경우 기본 디코딩 문자 세트를 결정합니다 ? – Marius

+0

마리우스, 내 대답에 추가했습니다 : "이미지 참조가 포함 된 HTML 페이지의 인코딩을 확인하십시오 .HTTP 헤더와 메타 태그를 모두 검토하고 명시 적으로 UTF-8로 선언해야합니다.그렇지 않으면 브라우저가 참조를 잘못 해석 할 수 있습니다. " –

+0

해결책의 그 부분은 있지만이 경우 브라우저에서 직접 URL을 호출하면 html 페이지에 포함되지 않고, % C3 % B8로 urlencoded, 우분투에서 디코딩, nginx 또는 구성 가능한 문자 세트를 구성합니다. – Marius