[asp.net-mvc] URL의 점으로 인해 ASP.NET mvc 및 IIS에서 404가 발생 함

내 URL에 경로가 필요한 프로젝트가 있습니다. 예를 들어 www.example.com/people/michael.phelps와 같은 URL이있을 수 있습니다.

점이있는 URL은 404를 생성합니다. 내 라우팅은 괜찮습니다. 점없이 michaelphelps를 전달하면 모든 것이 작동합니다. 점을 추가하면 404 오류가 발생합니다. 샘플 사이트는 IIS8 Express가 설치된 Windows 7에서 실행됩니다. URLScan이 실행되고 있지 않습니다.

web.config에 다음을 추가하려고했습니다.

<security>
  <requestFiltering allowDoubleEscaping="true"/>
</security>

불행히도 그것은 차이가 없었습니다. 404.0 Not Found 오류가 나타납니다.

이것은 MVC4 프로젝트이지만 관련이 있다고 생각하지 않습니다. 내 라우팅이 제대로 작동하고 도트가 포함될 때까지 내가 기대하는 매개 변수가 있습니다.

URL에 점을 표시하려면 무엇을 구성해야합니까?



답변

내 사이트의 HTTP 처리기를 편집 하여이 작업을 수행했습니다. 내 필요에 따라 이것은 잘 작동하고 내 문제를 해결합니다.

특정 경로 기준을 찾는 새로운 HTTP 처리기를 추가했습니다. 요청이 일치하면 처리를 위해 .NET으로 올바르게 전송됩니다. URLRewrite가 해킹하거나 RAMMFAR을 활성화하는이 솔루션에 훨씬 만족합니다.

예를 들어 .NET에서 URL www.example.com/people/michael.phelps를 처리 하려면 system.webServer / handlers요소 내의 사이트 web.config에 다음 행을 추가하십시오 .

<add name="ApiURIs-ISAPI-Integrated-4.0"
     path="/people/*"
     verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

편집하다

이 문제에 대한 해결책이 RAMMFAR또는 임을 제안하는 다른 게시물이 RunAllManagedModulesForAllRequests있습니다. 이 옵션을 활성화하면 모든 요청에 ​​대해 모든 관리 모듈이 활성화됩니다. 즉, 이미지, PDF 및 기타 모든 파일과 같은 정적 파일은 필요하지 않을 때 .NET에서 처리됩니다. 특별한 경우가 없으면이 옵션을 사용하지 않는 것이 가장 좋습니다.


답변

주위를 파고 든 후 relaxUrlToFileSystemMapping이 전혀 작동하지 않는다는 것을 알았습니다. 내 경우에는 RAMMFAR를 true로 설정하고 (.net 4.0 + mvc3) 및 (.net 4.5 + mvc4)에도 유효합니다.

<system.webserver>
    <modules runAllManagedModulesForAllRequests="true">

RAMMFAR 및 성능에 대한 RAMMFAR True Hanselman 게시물을 설정할 때주의하십시오


답변

web.config에서 relaxUrlToFileSystemMapping 속성을 설정해야한다고 생각합니다. Haack 은 얼마 전에 이것에 관한 기사를 썼습니다 (그리고 같은 유형의 질문을하는 다른 SO 게시물이 있습니다)

<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />

편집
아래 설명에서 .NET / IIS의 이후 버전에서는이 system.WebServer요소 가 필요합니다 .

<system.webServer>
<httpRuntime relaxedUrlToFileSystemMapping="true" />


답변

나는 다른 모든 구제 조치를 취하지 않고 오랫동안이 문제에 갇혔습니다.

점 [.]이 포함 된 URL 끝에 슬래시 [/]를 추가 할 때 404 오류가 발생하지 않았으며 실제로 작동했습니다.

마지막으로 IIS URL Rewrite와 같은 URL Rewriter를 사용하여 특정 패턴을 관찰하고 훈련 슬래시를 추가하여 문제를 해결했습니다.

내 URL은 다음과 같습니다. /Contact/~firstname.lastname 내 패턴은 다음과 같습니다. /Contact/~(.*[^/])$

Scott Forsyth 에서이 아이디어를 얻었습니다. 아래 링크를 참조하십시오 :
http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path


답변

이 섹션을 Web.config에 추가하면 pathInfo에 점이있는 경우에도 route / {* pathInfo}에 대한 모든 요청이 지정된 핸들러에 의해 처리됩니다. (ServiceStack MVC 호스트 Web.config 예제 및 https://stackoverflow.com/a/12151501/801189 에서 가져옴 )

이것은 IIS 6과 7 모두에서 작동해야합니다. ‘add’요소에서 path = “*”를 수정하여 ‘route’다음에 다른 핸들러에 특정 핸들러를 지정할 수 있습니다.

  <location path="route">
    <system.web>
      <httpHandlers>
        <add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" />
      </httpHandlers>
    </system.web>
    <!-- Required for IIS 7.0 -->
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
      <validation validateIntegratedModeConfiguration="false" />
      <handlers>
        <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" />
      </handlers>
    </system.webServer>
  </location>


답변

MVC 5.0 해결 방법.

제안 된 답변 중 많은 부분이 MVC 5.0에서 작동하지 않는 것 같습니다.

마지막 섹션의 404 도트 문제는 슬래시로 해당 섹션을 닫아 해결할 수 있으므로 여기에 내가 사용하는 깔끔하고 간단한 작은 트릭이 있습니다.

편리한 자리 표시자를 유지하면서 :

@Html.ActionLink("Change your Town", "Manage", "GeoData", new { id = User.Identity.Name }, null)

작은 jquery / javascript를 추가하여 작업을 완료하십시오.

<script>
    $('a:contains("Change your Town")').on("click", function (event) {
        event.preventDefault();
        window.location.href = '@Url.Action("Manage", "GeoData", new { id = User.Identity.Name })' + "/";
    });</script>

후행 슬래시에 유의하십시오.

http://localhost:51003/GeoData/Manage/user@foo.com

으로

http://localhost:51003/GeoData/Manage/user@foo.com/


답변

하나의 웹 페이지에만있는 사람들에게는 매우 쉬운 답변입니다. 작업 링크와 그 끝에있는 + “/”를 편집하십시오.

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |