316

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

带有点的 URL 会生成 404。我的路由很好。如果我传入迈克尔菲尔普斯,没有点,那么一切正常。如果我添加点,我会收到 404 错误。示例站点在带有 IIS8 Express 的 Windows 7 上运行。URLScan 未运行。

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

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

不幸的是,这并没有什么不同。我刚刚收到 404.0 Not Found 错误。

这是一个 MVC4 项目,但我认为这无关紧要。我的路由工作正常,并且我期望的参数在那里,直到它们包含一个点。

我需要配置什么才能在我的 URL 中添加点?

4

18 回答 18

387

我通过编辑我的网站的 HTTP 处理程序来完成这项工作。对于我的需要,这很好用并解决了我的问题。

我只是添加了一个新的 HTTP 处理程序来查找特定的路径条件。如果请求匹配,它会正确发送到 .NET 进行处理。我对 URLRewrite hack 或启用 RAMMFAR 的解决方案更满意。

例如,让 .NET 处理 URL www.example.com/people/michael.phelps 将以下行添加到您网站的 web.configsystem.webServer / handlers元素中:

<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" />

编辑

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

于 2012-08-28T01:01:06.993 回答
50

经过一番摸索后,我发现 RelaxUrlToFileSystemMapping 对我根本不起作用,在我的情况下起作用的是将 RAMMFAR 设置为 true,同样适用于 (.net 4.0 + mvc3) 和 (.net 4.5 + mvc4)。

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

设置 RAMMFAR 时请注意有关 RAMMFAR 和性能的 Hanselman 帖子

于 2012-08-21T23:19:01.197 回答
29

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

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

编辑 从下面的评论中,.NET / IIS 的更高版本可能需要它在system.WebServer元素中。

<system.webServer>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
于 2012-07-30T21:39:09.997 回答
26

在所有不同的补救措施之后,我在这个问题上停留了很长时间,但无济于事。

我注意到,当在包含点 [.] 的 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

于 2015-05-30T15:41:12.203 回答
21

只需将此部分添加到 Web.config 中,对 route/{*pathInfo} 的所有请求都将由指定的处理程序处理,即使 pathInfo 中有点。(取自 ServiceStack MVC Host 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>
于 2013-05-17T11:18:49.320 回答
6

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/
于 2017-02-24T18:54:08.617 回答
5

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

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |
于 2016-11-29T18:00:54.547 回答
3

Depending on how important it is for you to keep your URI without querystrings, you can also just pass the value with dots as part of the querystring, not the URI.

E.g. www.example.com/people?name=michael.phelps will work, without having to change any settings or anything.

You lose the elegance of having a clean URI, but this solution does not require changing or adding any settings or handlers.

于 2018-08-01T18:08:55.873 回答
2

您可能需要考虑使用破折号而不是句点。

Pro ASP MVC 3 框架中,他们建议关于制作友好的 URL:

避免使用符号、代码和字符序列。如果您需要单词分隔符,请使用破折号 (/my-great-article)。下划线不友好,URL 编码的空格很奇怪(/my+great+article)或恶心(/my%20great%20article)。

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

不要对 HTML 页面使用文件扩展名(.aspx 或 .mvc),但应将它们用于专门的文件类型(.jpg、.pdf、.zip 等)。如果您适当地设置 MIME 类型,Web 浏览器不会关心文件扩展名,但人们仍然希望 PDF 文件以 .pdf 结尾

因此,虽然一个句点对人类来说仍然是可读的(尽管它的可读性不如破折号,IMO),但根据句点之后的内容,它可能仍然有点令人困惑/误导。如果某人的姓氏是 zip 怎么办?然后 URL 将是 /John.zip 而不是 /John-zip,这甚至可能对编写应用程序的开发人员产生误导。

于 2012-08-29T16:43:33.920 回答
1

尝试了上述所有解决方案,但没有一个对我有用。起作用的是我卸载了 .NET 版本 > 4.5,包括它的所有多语言版本;最终,我逐个添加了更新的(仅限英文)版本。现在我系统上安装的版本是这样的:

  • 2.0
  • 3.0
  • 3.5 4
  • 4.5
  • 4.5.1
  • 4.5.2
  • 4.6
  • 4.6.1

它在这一点上仍然有效。我害怕安装 4.6.2,因为它可能会搞砸一切。

所以我只能推测 4.6.2 或所有那些非英语版本都搞乱了我的配置。

于 2016-05-23T09:27:31.350 回答
1

作为解决方案,还可以考虑编码为不包含 symbol 的格式.,如 base64。

在js中应该添加

btoa(parameter); 

在控制器中

byte[] bytes = Convert.FromBase64String(parameter);
string parameter= Encoding.UTF8.GetString(bytes);
于 2017-06-13T08:49:20.083 回答
1

就像更改 path=" 一样简单。" 到路径=“ ”。只需在 web.config 中删除 ExensionlessUrlHandler-Integrated-4.0 路径中的点即可。

这是一篇不错的文章https://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application

于 2019-02-21T09:35:01.283 回答
1

是否可以更改您的 URL 结构?
对于我正在做的事情,我尝试了一条路线

url: "Download/{fileName}"

但它失败了任何有 . 在里面。

我将路线切换到

    routes.MapRoute(
        name: "Download",
        url:  "{fileName}/Download",
        defaults: new { controller = "Home", action = "Download", }
    );

现在我可以放进去localhost:xxxxx/File1.doc/Download,它工作正常。

我在视图中的助手也接受了它

     @Html.ActionLink("click here", "Download", new { fileName = "File1.doc"})

这也链接到localhost:xxxxx/File1.doc/Download格式。

也许您可以在路线的末尾放置一个不需要的词,例如“/view”或操作,这样您的属性就可以以尾随之/类的结尾/mike.smith/view

于 2015-10-16T17:30:56.010 回答
0

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

于 2014-02-12T18:47:57.960 回答
0

这是我在 IIS 7.5 和 .NET Framework 4.5 环境中找到的错误 404 的最佳解决方案,并且不使用:runAllManagedModulesForAllRequests="true"

我关注了这个帖子:https ://forums.asp.net/t/2070064.aspx?Web+API+2+URL+routing+404+error+on+IIS+7+5+IIS+Express+works+fine我已经相应地修改了我的 web.config,现在 MVC Web 应用程序在 IIS 7.5 和 .NET Framework 4.5 环境中运行良好。

于 2020-12-08T11:42:36.990 回答
0

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

于 2018-06-14T09:59:04.297 回答
0

将 URL 重写规则添加到 Web.config 存档。您需要在 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> 
于 2018-05-10T21:53:27.193 回答
-3
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplication1.Controllers
{
    [RoutePrefix("File")]
    [Route("{action=index}")]
    public class FileController : Controller
    {
        // GET: File
        public ActionResult Index()
        {
            return View();
        }

        [AllowAnonymous]
        [Route("Image/{extension?}/{filename}")]
        public ActionResult Image(string extension, string filename)
        {
            var dir = Server.MapPath("/app_data/images");

            var path = Path.Combine(dir, filename+"."+ (extension!=null?    extension:"jpg"));
           // var extension = filename.Substring(0,filename.LastIndexOf("."));

            return base.File(path, "image/jpeg");
        }
    }
}
于 2015-12-20T16:12:27.177 回答