본문 바로가기

Windows(IIS)

파일업로드시 404에러

파일 업로드 시 404 에러가 발생하는 경우가 종종 있다.

 

그 원인은 보안상 특정용량이상의 요청이 수용되지 않도록 하기 위해 제한을 두었기 때문이다.

 

.NETFramework1.1까지는 4MB 였다. (machine.config를 확인해 보면 된다.)

 

그리고 그 외에는 특별하게 Framework 에서 제한을 두지는 않는것 같다. (내가 모르는것일 수도 있다.)

 

하지만 IIS7에서 부터는 30MB로 제한을 한다.

 

그래서 그 이상의 요청(대부분이 파일 업로드)이 오면 404에러를 발생한다.

 

또한 이러한 용량과 관련하여 요청시간도 제한되어져 있다.

 

그럼 이것을 어떻게 풀어주는지 살펴보도록 하자.

(요청시간과 허용용량을 다 풀어주어야 한다.)

 

해결 방법은 아주 간단하다.

 

먼저 IIS6이다. web.config에 다음 요소만 추가해 주면 된다.

 

<system.web>
       <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>

 

 

크리에이티브 커먼즈 라이선스
Creative Commons License