간혹 웹페이지 수정을 최소화 하기위해서, URL에 파일명 없이 다운로드 받고 싶은 경우가 많이 있을 것이다.
예를 들어,
http://www.example.com/latest/
입력시, 가장 최신의 파일을 다운로드 받는 형태가 될 것이다.
물론 서버 사이드 스크립트나 자바스크립트 등을 활용해 쉽게 목적을 이룰 수 있지만, 코드 변경 없이 IIS 의 URL Rewrite 만을 활용해 처리해 볼 생각이다.
IIS 에 Site 를 만들고, 문서 최상위 폴더 아래 다운로드 될 파일이 있는 file 이라는 폴더를 추가하고, 해당 폴더에 aaa.exe 라는 파일을 한개 추가 하였다.
서버 IP와 경로를 넣고 파일 명을 넣으면 정상적으로 파일이 다운로드 된다.
http://192.168.111.10/file/aaa.exe
하지만 파일명 없이 http GET을 하면 200 OK 가 나오지만, 해당 폴더에 Default Document 가 없으니 빈 화면만 표시된다.
이제 파일명 없이 file 까지만 입력해도 파일을 다운로드 되게 만들어 보자.
IIS > 웹서버 > Sites > 생성한 서버로 가서, Features View에서 URL Rewrite를 더블클릭한다.
우측 상단의 Add Rule(s)...클릭 후 Inbound rules 에서 Blank rule 선택 후 OK 클릭
Name은 아무 이름이나 (아래 예제에서는 test) 넣고,
Match URL 에서
Requested URL : Matches the Pattern
Using : Regular Expressions
Pattern : ^file/?$
Ignore case : 선택
Server Variables 에서 우측 Add... 클릭 후,
Server variable name : file_name
Value : aaa.exe (다운로드 받을 파일의 이름)
Action 에서
Action type : Rewrite
Rewrite URL : file/{file_name}
Stop processiong of subsequent rules : 선택
최종적으로 아래와 같이 설정 후 우측의 Apply 를 클릭한다.
위 내용을 간단히 설명하면,
GET /file 또는 GET /file/ 요청이 들어오면,
GET /file/aaa.exe 로 변경해 서버에 요청한다는 내용이다.
이제 브라우저에서 http://192.168.111.10/file 을 입력해보자.
파일이 뭔가 다운로드 된다. 훌륭하다.
그런데, 파일명이 이상하다. 파일명이 file 이다.
웹브라우저는 /file 을 요청했고, 웹서버는 application/octet-stream 타입으로 그에 대한 응답을 했을 뿐이다.
이를 해결하기 위해서 필요한게 Content-Disposition 헤더 이다.
간단히 말하면, 응답 시 해당 헤더에 파일이름을 알려줘서, 다운로드 때 서버가 의도한 대로 파일이름을 지정할 수 있는 것이다.
이번엔 응답에 대한 동작이므로, URL Rewrite 로 가서, Add Rule(s)... 클릭 후 Outbound rules 섹션의 Blank rule 선택 후 OK 클릭
Name 에 원하는 이름을 입력 하고,(예제에서는 download_file_name)
Precondition 에서 <Create New Precondition...>을 선택한다.
Name 에 원하는 이름을 입력(예제에서는 EXEFiles)하고, 아래 그림과 같이 입력한다.
응답에 Content-Type: application/octet-stream 인 경우 해당 동작을 하는 것으로, application/octet-stream 은 뭔지 모르는 바이너리의 경우 사용하는 타입이다. (주로 파일 다운로드 등)
Match 에서,
Matching scope : Server Variable 선택
Variable name : RESPONSE_CONTENT_DISPOSITION
Variable value : Matches the Pattern
Using : Regular Expressions
Pattern : .*
Action 에서
Action type : Rewrite
Value : attachment; filename="{file_name}"
Replace existing server variable value : 선택
Stop processing of subsequent rules : 선택
최종 적으로 아래와 같이 설정 후 좌측에 Apply 클릭 한다.
이제 다시 웹 브라우저에서
http://192.168.111.10/file
또는
http://192.168.111.10/file/
를 입력하면,
CONTENT-DISPOSITION: 헤더와 값도 정상적으로 입력이 되고,
※ http 표준에서는 헤더명의 대소문자를 구별하지 않습니다.
CONTENT-DISPOSITION
Content-disposition
Content-Disposition
content-disposition
모두 동일 한 헤더명으로 인식 합니다.
파일명도 의도한 대로 aaa.exe 로 정상적으로 다운로드 되었다.
만약 파일을 aaa.exe 에서 bbb.exe로 변경이 필요하면,
/file 폴더에 bbb.exe 파일을 복사 후, URL Rewrite의 Inbound 섹션에 있는 룰에서
Server Variables섹션의 file_name 의 값을 aaa.exe 에서 bbb.exe 로 변경하면 된다.