[Nginx] proxy에서 넘어오는 Content-Type 덮어쓰기

gilchris·2021년 8월 18일
0

Nginx에서 Contet-Type을 결정하는 방법

  1. nginx는 기본적으로 proxy에서 반환하는 헤더의 Content-Type을 그대로 사용한다.
  2. proxy를 호출하지 않는 경우에는 해당 URL의 확장자를 mime.types 파일의 내용에 대입해서 가져온다.
    1. mime.types 파일은 보통 /etc/nginx/mime.types 에 위치한다.
    2. 이걸 사용하려면 다음과 같이 nginx 설정 중 http 블록에서 include 해야 한다. http 블록은 보통 /etc/nginx/nginx.conf 내에 있다.
http {
    # ....
    include       /etc/nginx/mime.types;
    # ....
}

그런데, proxy에서 반환하는 Content-Type을 사용하지 않고 mime.types에 있는 값을 사용하려고 하면 딱히 방법이 없다. mime.types을 그대로 사용할 순 없지만 다행히(?) 비슷하게 처리할 수 있는 방법을 찾았다.

proxy에서 넘어오는 Content-Type 무시하기

nginx는 자동으로 proxy로부터 오는 몇가지 헤더값을 클라이언트에 전송하지 않는다.
그런데 proxy_hide_header 를 사용하면 자동으로 전송하지 않는 것 이외에 클라이언트에 전송하지 않을 헤더를 추가할 수 있다.

location ~ .xyz$ {
    # ....
    proxy_hide_header Content-Type;
    # ....
}

mime.types을 대신할 map 만들기

proxy에서 넘어오는 응답은 mime.types를 자동으로 이용할 수 없기 때문에 이를 대체할만한 것을 만들어줘야 한다.
nginx에 map은 첫 줄 왼쪽값이 블록의 왼쪽 정규표현식에 해당되면 첫 줄 오른쪽의 변수에 해당 오른쪽 값을 넣어준다.
아래와 같은 설정이 있을 때, 예를 들어 $uri에 '어쩌구.json' 이라는 값이 온다면, $custom_content_type 변수에 'application/json' 값이 들어가는 형태.
map도 http 블록안에만 위치할 수 있다.

http { 
    # ....
    map $uri $custom_content_type { 
        default           text/html;
        ~(.*.json)$       application/json; 
        ~(.*.css)$        text/css; 
        ~(.*.js)$         application/javascript; 
        ~(.*.[jpg|jpeg])$ image/jpeg; 
        ~(.*.gif)$        image/gif; 
        ~(.*.png)$        image/png; 
        ~(.*.ico)$        image/x-icon; 
        ~(.*.woff)$       application/font-woff; 
        ~(.*.mp4)$        video/mp4; 
        ~(.*.xyz)$        application/xyz;
    } 
    # ....
}

Content-Type 덮어쓰기

이제 지운 Content-Type 대신에 위에서 만든 map을 이용해서 새로운 Content-Type을 넣어보자.

location ~ .xyz$ { 
    # .... 
    proxy_hide_header Content-Type; 
    add_header Content-Type $custom_content_type;
    # .... 
}

참고

0개의 댓글