카테고리 없음

IIS URL Rewrite 활용해서 파일명 없이 다운로드 받기

virbr0.net 2024. 1. 22. 00:26

간혹 웹페이지 수정을 최소화 하기위해서, 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 로 변경하면 된다.