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

带有点的url会生成404。我的路由是好的。如果我传入michaelphelps,没有点,那么一切正常。如果我加一个点,就会得到404错误。示例站点运行在Windows 7和IIS8 Express上。URLScan未运行。

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

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

不幸的是,这并没有什么不同。我刚刚收到一个404.0未找到错误。

这是一个MVC4项目,但我不认为这是相关的。我的路由工作得很好,我所期望的参数都在那里,直到它们包含一个点。

我需要配置什么才能在我的URL中有圆点?


当前回答

根据保留URI而不使用查询字符串的重要性,也可以将带有圆点的值作为查询字符串的一部分,而不是URI。

例如,www.example.com/people?name=michael.phelps将工作,无需更改任何设置或任何东西。

您失去了拥有干净URI的优雅性,但此解决方案不需要更改或添加任何设置或处理程序。

其他回答

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/

我在这个问题上卡了很长一段时间,遵循了所有不同的补救措施,但都没有效果。

我注意到,当在包含点[.]的URL末尾添加正斜杠[/]时。),它没有抛出404错误,而且它确实工作了。

我最终解决了这个问题,使用一个URL重写器,如IIS URL重写,以观察一个特定的模式,并附加训练斜杠。

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

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

只需将此部分添加到Web。所有对路由/{*pathInfo}的请求都将由指定的处理程序处理,即使在pathInfo中有点。(取自ServiceStack MVC主机Web。配置示例和这个答案https://stackoverflow.com/a/12151501/801189)

这应该适用于iis6和iis7。你可以通过修改'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>

我相信你必须在你的web.config中设置弛豫urltofilesystemmapping属性。不久前,Haack写了一篇关于这个问题的文章(还有其他一些SO帖子也问了同样类型的问题)

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

编辑 从下面的评论中可以看出,. net / IIS的后续版本可能需要在系统中安装这个。网络服务器的元素。

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

我能够解决这个问题的特定版本(必须使/customer.html路由到/customer,不允许拖尾斜杠)使用https://stackoverflow.com/a/13082446/1454265的解决方案,并替换path="*.html"。