URL中的点导致404使用ASP.NET mvc和IIS

Mar*_*ark 298 iis asp.net-mvc iis-7 iis-express iis-8

我有一个项目,要求我的URL在路径中有点.例如,我可能有一个URL,例如www.example.com/people/michael.phelps

带点的网址生成404.我的路由很好.如果我通过michaelphelps,没有圆点,那么一切正常.如果我添加点我得到404错误.示例站点在带有IIS8 Express的Windows 7上运行.URLScan未运行.

我尝试将以下内容添加到我的web.config中:

<security>
  <requestFiltering allowDoubleEscaping="true"/>
</security>
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有什么区别.我刚收到404.0 Not Found错误.

这是一个MVC4项目,但我不认为这是相关的.我的路由工作正常,我期望的参数在那里,直到它们包含一个点.

我需要配置什么才能在网址中加点?

Mar*_*ark 371

我通过编辑我的网站的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" />
Run Code Online (Sandbox Code Playgroud)

编辑

还有其他帖子表明此问题的解决方案是RAMMFARRunAllManagedModulesForAllRequests.启用此选项将为所有请求启用所有托管模块.这意味着静态文件(如图像,PDF和其他所有内容)将在不需要时由.NET处理.除非您有特定的案例,否则最好不要使用此选项.

  • 在使用[path ="*"]添加此对所有静态文件(如.css,.js)的请求失败后.我有一个自定义路由来处理看起来像这样的"http://domain/ABCDE.FGHIJ"的网址.我的所有静态文件都在我的/ Content目录中.有没有办法从中排除整个目录?将RAMMFAR设置为true可以正常工作,但我想避免这种开销. (10认同)
  • 我担心这不适用于MVC 5. (9认同)
  • 这是一个完整的例子http://stackoverflow.com/a/16607685/801189基于这个答案 (3认同)
  • 这在MVC 5上对我来说很好 (3认同)
  • 它适用于MVC5,但是如果你在路径的开头加上斜杠,它只在路径紧跟在主机名之后才有效(它与app文件夹不相关).例如,路径/人/*适用于www.example.com/people/michael.phelps,但不适用于www.example.com/app/people/michael.phelps.AFAIK没有办法制作相对于app的路径. (3认同)
  • 本地IIS使用启动斜杠,但IIS8只能在没有第一个斜杠的情况下理解路由. (2认同)
  • 我和@lamarant有同样的问题......它会阻止静态文件.你知道为什么吗?在这里使用MVC4. (2认同)
  • 与@lamarant 和 eestein 相同的问题……所有静态文件都被阻止了……这个“副作用”有什么解决方案吗?如果没有解决这个问题,这个答案对我来说不是一个可行的解决方案...... (2认同)

Tad*_*aia 46

经过一番探讨之后,我发现relaxUrlToFileSystemMapping对我来说根本不起作用,在我的情况下工作的是将RAMMFAR设置为true,同样适用于(.net 4.0 + mvc3)和(.net 4.5 + mvc4).

<system.webserver>
    <modules runAllManagedModulesForAllRequests="true">
Run Code Online (Sandbox Code Playgroud)

在设置RAMMFAR真正的Hanselman关于RAMMFAR和性能的帖子时要注意

  • 设置RAMMFAR时要注意......如果我使用此模块会有任何性能损失<modules runAllManagedModulesForAllRequests ="true"> (5认同)

Tom*_*mmy 27

我相信你必须在你的web.config中设置属性relaxedUrlToFileSystemMapping. 哈克不久前写了一篇关于这篇的文章(还有一些其他的SO帖子提出了相同类型的问题)

<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了relaxedUrlToFileSystemMapping但没有成功.我不认为它适用于最新版本的MVC. (4认同)
  • 有趣.鉴于它不适合你,我打算假设这对我不起作用......因为我使用的是.NET4的MVC4.但宾果游戏,无论如何都有效.在我的情况下,我只是有一个带有句号"."的URL.作为最后一个角色.我得到了404,但这解决了它. (3认同)
  • 这就是我对mvc3 + .net4.0所做的工作,并且工作得非常好,但是不再使用mvc4 + .net4.5了. (2认同)

小智 23

很长一段时间我在这个问题上遇到了所有不同的补救措施而无济于事.

我注意到,当在包含点[.]的URL的末尾添加正斜杠[/]时,它没有抛出404错误,它实际上有效.

我终于使用像IIS URL Rewrite这样的URL重写器来解决问题,以监视特定模式并附加训练斜杠.

我的URL看起来像这样:/Contact/~firstname.lastname所以我的模式很简单:/Contact/~(.*[^/])$

我从Scott Forsyth那里得到了这个想法,请看下面的链接:http: //weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path


V.B*_*.B. 21

只需将此部分添加到Web.config,即使pathInfo中有点,指定处理程序也将处理对路径/ {*pathInfo}的所有请求.(取自ServiceStack MVC Host Web.config示例和此答案/sf/answers/850605101/)

这应该适用于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>
Run Code Online (Sandbox Code Playgroud)

  • 注意runAllManagedModulesForAllRequests(RAMMFAR)具有的性能影响.这将为每个请求启用所有托管模块.静态文件(如图像)可以由IIS直接处理,但是会通过每个模块处理它们,从而为每个请求增加开销. (2认同)

Luk*_*uke 6

MVC 5.0解决方法.

许多建议的答案在MVC 5.0中似乎不起作用.

由于最后一节中的404点问题可以通过使用尾部斜杠关闭该部分来解决,这里是我使用的小技巧,干净简单.

在视图中保留方便的占位符:

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

添加一点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>
Run Code Online (Sandbox Code Playgroud)

请注意尾随斜线,负责更改

http://localhost:51003/GeoData/Manage/user@foo.com
Run Code Online (Sandbox Code Playgroud)

http://localhost:51003/GeoData/Manage/user@foo.com/
Run Code Online (Sandbox Code Playgroud)


小智 5

对于那些只在一个网页上有这个的人来说,超级简单的答案。编辑您的操作链接并在其末尾添加一个 +“/”。

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |
Run Code Online (Sandbox Code Playgroud)