2015-02-06 7 views
0

나는 PlayFramework 2.3을 사용하여 응용 프로그램을 만들었고 어느 ​​시점에 CSV 파일을 업로드하고 거기에 데이터베이스를 채 웁니다.prod에서만 인코딩 문제가 발생합니까?

로컬 (127.0.0.1:9000)에서 앱에 액세스 할 때 업로드를 수행하면 모든 것이 제대로 작동하고 파일이 업로드되고 구문 분석되어 아무 문제없이 데이터베이스에 추가됩니다.

동일한 절차가 생산 단계에서 수행되지만 모든 악센트 부호가있는 캐랙터는 ��으로 대체됩니다.

데브과 자극 사이의 주요 차이점은 다음

DEV에서
  • , I는 PROD에서
  • , 난 nginx를 통해 애플리케이션에 액세스 PlayFramework (localserver)로부터 직접 애플리케이션을 액세스 할 수 redirets 것을 Play (Proxy)의 로컬 인스턴스

    • CSV 파일은 UTF-8 인코딩 (주 : 물론, 그것은 내가 테스트 같은 파일입니다)입니다 : 사용하여 만든 데이터베이스에
    • 가 연결이

    여기에 자세한 것을 정보입니다 UTF-8 ->db.default.url="jdbc:mysql://127.0.0.1/2leadin?characterEncoding=UTF-8"

  • 내가 (파이어 폭스를 사용하여), HTML 페이지는 UTF-8을 마지막으로

에 반환 테스트 여기

  • 내 Nginx의 구성 :

    proxy_buffering off; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Scheme "https"; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_http_version 1.1; 
    
    server { 
         listen 80; 
         server_name my.2lead.in; 
         return  301 https://my.2lead.in; 
    } 
    
    server { 
        listen    443; 
        ssl     on; 
        root     /var/www/2lead.in/errors/; 
    
        # http://www.selfsignedcertificate.com/ is useful for development testing 
        ssl_certificate  /ssl/2lead.crt; 
        ssl_certificate_key /ssl/2lead.key; 
    
        # From https://bettercrypto.org/static/applied-crypto-hardening.pdf 
        ssl_prefer_server_ciphers on; 
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # not possible to do exclusive 
        ssl_ciphers 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA'; 
        add_header Strict-Transport-Security max-age=15768000; # six months 
        # use this only if all subdomains support HTTPS! 
        # add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" 
    
        keepalive_timeout 70; 
        server_name my.2lead.in; 
    
        # remove the robots line if you want to use wordpress' virtual robots.txt 
        location = /robots.txt { access_log off; log_not_found off; } 
        location = /favicon.ico { access_log off; log_not_found off; } 
    
        location /public { 
         alias /var/www/2lead.in/my/public/; 
         access_log off; 
         log_not_found off; 
        } 
    
        location/{ 
         proxy_pass http://127.0.0.1:9100; 
        } 
    
        location ~ /\.git { 
         deny all; 
        } 
    
        error_page 502 @maintenance; 
        location @maintenance { 
         rewrite ^(.*)$ /error502.html break; 
        } 
    } 
    

    내가 실종 된 이유는 무엇입니까? 왜 내가 PROD에서만 인코딩 문제가 발생 했습니까? 나는 그것이 NGinx 때문이라고 확신하지만 이유를 찾을 수 없습니다.

    감사합니다.

  • +0

    아마 당신의 앱은 파일 조작 중 하나에서 기본 문자 세트를 사용하고 있으며, 프로덕션 서버와 로컬 시스템에서는 기본값이 다릅니다 ('file.encoding' env var; 로케일 종속성을 확인하십시오). 명시 적 charset을 생략하고 이러한 이식성 문제로 끝낼 수있는 곳의 수는 알지만 코드를 보지 않아도 알 수 없습니다. 그것이 NGinx라면 나는 놀랄 것이다. – Mikesname

    +0

    나는 간단한 HelloWorld.java를'System.out.println (System.getProperty ("file.encoding"));으로 작성했다. 로컬 서버에서'UTF-8'을 출력했습니다. prod에서 ANSI_X3.4-1968을 가졌습니다. 동일한 결과 (ANSI_X3.4-1968)로'java -DFile.encoding = UTF-8 HelloWorld'로 인코딩하려고했습니다. 왜? 방법? :/ –

    +0

    기다려라, 그것은'java -Dfile '과 함께 잘못된 명령 줄이었다.encoding = UTF-8 HelloWorld' (하위 F/파일)이면 출력은 UTF-8입니다. 앱을 다시 시작하고 문제가 해결되는지 확인하겠습니다. –

    답변

    1

    기본 Java 문자 집합은 로캘에 따라 다르며 file.encoding 환경 변수에서 가져옵니다 (this answer 참조). 다른 컴퓨터에서 동작이 다르게 나타날 수 있습니다.

  • 는 모든 파일 작업이 캐릭터 세트를 지정해야

    • 는 서버가 -Dfile.encoding=UTF-8 실행되어 있는지 확인 (또는 무엇이든은 dev에 환경 일치) : 두 가지 방법은 편법 방법과보다 강력한 휴대용 방법을 해결하기 위해 명시 적으로 this answer으로 기본 시스템 인코딩에 의존 요약

    을 설명 취약 대부분의 경우 피해야한다.

  • 관련 문제