정리

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

gilchris 2021. 8. 19. 01:54

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;
    # ....
}

참고