我有一个项目,要求我的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中有圆点?


当前回答

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

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

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

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

其他回答

此外,(相关的)检查处理程序映射的顺序。我们在.ashx后面的路径中有一个.svc(例如/foo.asmx/bar.svc/path)。.svc映射首先是。svc路径,因此在。asmx之前匹配的。svc路径是404。 没有想太多,但也许url编码的路径会照顾到这一点。

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

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

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

添加URL重写规则到Web。配置档案。您需要在IIS中已经安装URL重写模块。使用下面的重写规则作为你自己的灵感。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

<system.webServer>
  <rewrite>
    <rules>
      <rule name="Add trailing slash for some URLs" stopProcessing="true">
        <match url="^(.*(\.).+[^\/])$" />
          <conditions>
              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
              <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Redirect" url="{R:1}/" />
      </rule>
    </rules>
    </rewrite>
</system.webServer>

</configuration> 

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/

你可能想要考虑使用破折号而不是句号。

在Pro ASP MVC 3框架中,他们建议创建友好的url:

避免使用符号、代码和字符序列。如果你想说句话 分隔符使用破折号(/my-great-article)。下划线不友好, url编码的空格是奇怪的(/my+great+article)或恶心的 (/ % 20大% 20篇文章)。

它还提到url应该易于阅读和更改。也许考虑使用破折号而不是点的原因也来自同一本书:

不要为HTML页面使用文件扩展名。Aspx或.mvc),但要将它们用于特殊的文件类型(.jpg, .pdf, .zip等)。如果您适当地设置了MIME类型,Web浏览器并不关心文件扩展名,但是人们仍然希望PDF文件以.pdf结尾

因此,虽然句号对人类来说仍然是可读的(尽管在我看来,它的可读性不如破折号),但它可能仍然有点令人困惑/误导,这取决于句号之后的内容。如果有人姓zip呢?那么URL将是/John.zip而不是/John-zip,这甚至会误导编写应用程序的开发人员。