Nginx에서 Contet-Type을 결정하는 방법
- nginx는 기본적으로 proxy에서 반환하는 헤더의 Content-Type을 그대로 사용한다.
- proxy를 호출하지 않는 경우에는 해당 URL의 확장자를 mime.types 파일의 내용에 대입해서 가져온다.
- mime.types 파일은 보통 /etc/nginx/mime.types 에 위치한다.
- 이걸 사용하려면 다음과 같이 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;
# ....
}