IIS6 및 IIS7 및 IIS7.5 : 기본 (쿼리 문자열이 아님)에서 더하기 부호 (+)가있는 URL 처리


38

쿼리 문자열이 아닌 기본 URL에 더하기 기호 (+)가있는 URL의 경우 IIS7 및 IIS7.5 (Windows Server 2008 및 2008 R2)는 URL을 ASP.NET 응용 프로그램의 기본 처리기로 전달하지 않는 것으로 보입니다. . 사용자 지정 HTTP 처리기로 문제를 알리기 시작했지만와 *.html동일한 문제가 *.aspx있습니다. IIS6 (Server 2003)은 동일한 URL에 문제가 없습니다.

문제를 복제하기 위해 ASP.NET 사이트에서 다양한 이름으로 간단한 Response.Write를 수행하는 ASPX 파일 세트를 만들었습니다.

  1. test_something.aspx
  2. test_some + thing.aspx
  3. test_some thing.aspx

세 번째 파일은 IIS7 [.5]가 (문자열에서와 같이) 더하기 기호를 공백으로 취급하는지 확인하기위한 테스트였습니다. 이것은 사실이 아닙니다. 대신에이 파일의 모든으로 타격 http://somehost/test_some+thing.aspx또는 http://somehost/test_some%2bthing.aspx어떤 ASP.NET 처리기에 도착하기 전에 IIS7 / IIS7.5에서 IIS6에서 잘 작동하지만 404 것이다. IIS 7 / 7.5에는 HTTP 처리기를 결정하는 데 사용되는 최종 확장명을 놓치지 않고 URL의 더하기 기호를 "볼"수없는 구성이 있습니까?


더하기 기호를 이스케이프하면 도움이 될지 궁금합니다. 아마도 \+?
Dennis Williamson

답변:


39

IIS와 더하기의 추가 조합을 검색 한 후 IIS7 [.5]는 기본적으로 해당 문자의 사용에 대한 두려움 때문에 더하기 부호가있는 URL을 거부하도록 설정되어 있습니다. 그러나 해당 기호는 여전히 쿼리 문자열에서 허용됩니다. 솔루션 에 requestFiltering 속성의 기본값을 변경하는 <system><webServer><security><requestFiltering>명령 행 호출을 이중으로 인코딩 된 문자를 허용하도록 (궁극적으로 수정하여 ASP.NET의 Web.config) :

%windir%\system32\inetsrv\appcmd set config "Default Web Site" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true

이것은 웹 사이트에서 선호하는 것보다 조금 더 위험 할 수 있지만 담요가 허용하는 것보다 더 구체적인 방법은 없었습니다. 경고는 URL에서 플러스를 사용하고 일반적인 번역을 공백으로 사용할 때 발생할 수있는 불일치에 관한 것입니다. 다른 대안은 URL에서 더하기 문자 사용을 중지하는 것입니다.


2
참고로 루트 레벨 템플리트에서이를 수행 할 필요는 없습니다. 이 작업은 모든 Web.config 파일에서 수행하거나 <location /> 태그를 사용하여 하위 폴더에 적용 할 수 있습니다.
mdonatas

IIS 관리자 : 사이트 => YourSite => 요청 필터링 => 기능 설정 편집 ... => 이중 이스케이프 허용 => 확인
diynevala

9

방금 IIS7이 URL의 공백에 플러스를 매핑하도록 설득하기 위해 다시 쓰기 규칙을 만드는 방법을 알아 냈습니다. 필자의 경우 레거시 책갈피 또는 하이퍼 링크를 계속 작동시키는 것이 었습니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="True" />
    </security>
    <rewrite>
      <rules>
        <rule name="RewriteUserFriendlyURL1" stopProcessing="false">
          <match url="\+" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="{UrlDecode:{REQUEST_URI}}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

자세한 내용과 참조는 내 블로그 게시물 을 참조하십시오.


1
위의 보안 섹션, 즉 allowDoubleEscaping을 "True"로 설정하여 쿼리 문자열에 더하기 기호가있는 레거시 URL을 지원해야하는 문제를 해결했습니다.
stephen

고유 한 사례가 있습니다. 일부 레거시 URL에는 "++"와 같이 두 개의 순차적 인 플러스가 있습니다. IIS는 이에 대해 특별한 규칙을 가지고있는 것 같습니다. 어떤 아이디어?
boomhauer

@ boomhauer 처리기를 작성해야하거나 다른 웹 서버를 사용하여 해당 URL을 호스팅해야합니까? 한 번 아파치 mod_rewrite가 많은 레거시 URL을 처리하고 다양한 새 위치로 리디렉션하면 약간 더 유연 해 보였습니다.
Nathan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.