파일 업로드 시 404 에러가 발생하는 경우가 종종 있다.
그 원인은 보안상 특정용량이상의 요청이 수용되지 않도록 하기 위해 제한을 두었기 때문이다.
.NETFramework1.1까지는 4MB 였다. (machine.config를 확인해 보면 된다.)
그리고 그 외에는 특별하게 Framework 에서 제한을 두지는 않는것 같다. (내가 모르는것일 수도 있다.)
하지만 IIS7에서 부터는 30MB로 제한을 한다.
그래서 그 이상의 요청(대부분이 파일 업로드)이 오면 404에러를 발생한다.
또한 이러한 용량과 관련하여 요청시간도 제한되어져 있다.
그럼 이것을 어떻게 풀어주는지 살펴보도록 하자.
(요청시간과 허용용량을 다 풀어주어야 한다.)
해결 방법은 아주 간단하다.
먼저 IIS6이다. web.config에 다음 요소만 추가해 주면 된다.
<httpRuntime executionTimeout="3600" maxRequestLength="2097151" />
</system.web>
여기서 executionTimeout의 단위는 초이고 maxRequestLength의 단위는 MB이다.
그러므로 위의 예제 샘플 코드는 요청시간은 1시간, 허용용량은 대략 2GB를 허용한 것이다.
IIS7에서는 다음 요소를 더 추가적으로 명시해 줘야한다.
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2000000000" />
</requestFiltering>
</security>
</system.webServer>
maxAllowedContentLength의 단위는 Byte 이다.
그러므로 위의 예제 샘플 코드는 대략 2GB를 허용한 것이다.
대부분 이렇게 설정하면 해결될 것이지만 IIS7에서는 가끔 안되는 경우들이 있을 수 있다.
그럼 아래 사항을 더 확인하거나 추가해 보도록 하자.
1. IIS7에서 위의 코드를 추가했을때 에러가 발생하는 경우
- C:\Windows\System32\inetsrv\config\applicationHost.config 을 열어서 (경로는 window 설치 경로에 따라 다를 수 있다.)
<section name="requestFiltering" overrideModeDefault="Deny" /> 이렇게 되어 있는것을 아래처럼 수정해 준다.
<section name="requestFiltering" overrideModeDefault="Allow" />
2. Timeout에 걸릴경우
- 아래 그림처럼 "연결시간제한"을 늘려준다. (아래 샘플은 20분으로 셋팅된 것이다.)
그 외의 팁들
위 예제는 모두 한정된 하나의 웹사이트에만 적용한 것이다.
전체 서버에 적용하려면 아래 명령어를 커맨드창에서 실행하면 된다. (1GB 허용)
C:\windows\system32\inetsrv\appcmd set config /section:requestfiltering /requestlimits.maxallowedcontentlength:1073741824
web.config의 location Tag 를 활용하면 좀 더 보안을 강화할 수 있다.
아래 예제는 관리자는 2GB까지 허용, 사용자는 20MB까지 허용으로 셋팅할 경우이다.
<location path="/admin">
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2000000000" />
</requestFiltering>
</security>
</system.webServer>
</location>
<location path="/user">
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="20000000" />
</requestFiltering>
</security>
</system.webServer>
</location>