在URL点导致404与ASP。NET mvc和IIS

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

108178 次浏览

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

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

<强>编辑 根据下面的注释,. net / IIS的后续版本可能需要在system.WebServer元素中。< / p >

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

在一些闲逛后,我发现relaxedUrlToFileSystemMapping根本不为我工作,在我的情况下工作的是将RAMMFAR设置为true,同样适用于(.net 4.0 + mvc3)和(.net 4.5 + mvc4)。

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

在将RAMMFAR设置为true Hanselman关于RAMMFAR和性能的文章时要注意

我通过编辑我的站点的HTTP处理程序得到了这个工作。对于我的需要,这很好地解决了我的问题。

我只是添加了一个新的HTTP处理程序,用于查找特定的路径条件。如果请求匹配,则正确地将其发送到. net进行处理。我更喜欢这个解决方案,URLRewrite黑客或启用RAMMFAR。

例如,要让. net处理URL www.example.com/people/michael.phelps,请在站点的web中添加以下行。system.webServer / handlers元素中的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" />

编辑

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

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

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

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

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

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

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

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

这应该适用于iis6 &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>

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

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

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

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

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

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

有可能改变你的URL结构吗?< br > 对于我正在工作的东西,我尝试了

的路由
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”或action,这样你的属性就可以以/结尾,比如/mike.smith/view

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");
}
}
}

尝试了上面所有的解决方案,但没有一个对我有效。我卸载了。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或所有那些非英文版本把我的配置弄乱了。

对于那些只在一个网页上有这个的人来说,超级简单的答案。编辑actionlink并在它的末尾加上+“/”。

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

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/

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

在js中应该添加

btoa(parameter);

在控制器

byte[] bytes = Convert.FromBase64String(parameter);
string parameter= Encoding.UTF8.GetString(bytes);

添加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>
另外,(相关)检查处理程序映射的顺序。我们在.ashx后面的路径中有一个.svc(例如/foo.asmx/bar.svc/path)。.svc映射首先是。svc路径,因此在。asmx之前匹配的。svc路径是404。 还没有想太多,但也许url编码的路径可以解决这个问题

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

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

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

这就像改变path="." to 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

这是我在iis7.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和我已经修改了我的网页。现在MVC web应用程序在iis7.5和. net Framework 4.5环境下工作得很好。