带点的URL会生成404。我的路由很好。如果我通过michaelphelps,但没有点号,则一切正常。如果添加点,则会出现404错误。该示例站点在带有IIS8 Express的Windows 7上运行。 URLScan没有运行。
我尝试将以下内容添加到我的web.config:
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
有所不同。我刚刚收到404.0找不到错误。
这是一个MVC4项目,但我认为这无关紧要。我的路由工作正常,并且期望的参数在那里,直到它们包含一个点。
#1 楼
我通过编辑站点的HTTP处理程序来完成此工作。对于我的需求,这很好并且可以解决我的问题。我只是添加了一个新的HTTP处理程序,以查找特定的路径条件。如果请求匹配,则将其正确发送到.NET进行处理。我对URLRewrite hack或启用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" />
编辑
还有其他帖子建议解决此问题的方法是
RAMMFAR
或RunAllManagedModulesForAllRequests
。启用此选项将为所有请求启用所有托管模块。这意味着静态文件(例如图像,PDF和其他所有文件)将在不需要时由.NET处理。除非您有特殊情况,否则最好不要使用此选项。评论
这是基于此答案的完整示例stackoverflow.com/a/16607685/801189
– V.B.
13年5月17日在11:20
将其与[path =“ *”]相加后,对任何静态文件(例如.css,.js)的所有请求都会失败。我有一个自定义路由,用于处理看起来像“ domain / ABCDE.FGHIJ”的网址。我所有的静态文件都在我的/ Content目录中。有没有办法从中排除整个目录?将RAMMFAR设置为true可以,但是我想避免这种开销。
– lamarant
2013年6月14日15:32
本地IIS可以使用斜杠开头,但是IIS8仅理解没有第一个斜杠的路由。
– Pavel Voronin
13年11月21日在15:11
我遇到的问题与@lamarant相同……它阻止了静态文件。你知道为什么吗?在这里使用MVC4。
–爱因斯坦
2014年8月9日在20:03
它可以在MVC5中使用,但是如果在路径的开头加上斜杠,则仅在路径紧随主机名之后才有效(与应用程序文件夹无关)。例如,路径/ people / *适用于www.example.com/people/michael.phelps,但不适用于www.example.com/app/people/michael.phelps。 AFAIK无法建立相对于应用程序的路径。
– Hogan
15年5月22日在11:20
#2 楼
经过一番摸索之后,我发现对我而言根本不使用RelaxedUrlToFileSystemMapping,在我的情况下有效的是将RAMMFAR设置为true,这对于(.net 4.0 + mvc3)和(.net 4.5 + mvc4)同样有效。 /><system.webserver>
<modules runAllManagedModulesForAllRequests="true">
在设置RAMMFAR时要特别注意Hanselman有关RAMMFAR和性能的帖子
评论
设置RAMMFAR时要注意...如果我使用此
– Shanker Paudel
2013年9月25日20:11在
在原始海报的情况下,由于他使用的是IIS7及更高版本,因此不需要。这是默认设置,设置RAMMFAR确实使您付出了高昂的代价。请参阅msdn.microsoft.com/en-us/library/…
–理查德
13年11月17日在13:18
尽管这很有用,但这还不足以让我停止在MVC5 / IIS7中返回404。
–克里斯·莫斯基尼(Chris Moschini)
16年1月11日在20:36
只是重申一下。您要避免打开此选项
–行程
18年1月17日,0:08
但是,即使有可能,也不要在实时站点上执行此操作。
– NickG
18年2月9日在10:41
#3 楼
我相信您必须在web.config中设置属性relaxedUrlToFileSystemMapping。 Haack不久前写了一篇关于此的文章(还有一些其他SO帖子问同样的问题)<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
下面,.NET / IIS的更高版本可能要求将其放在system.WebServer
元素中。 <system.webServer>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
评论
这是我在mvc3 + .net4.0上拥有的,并且工作得很漂亮,但是在mvc4 + .net4.5上不再工作了。
–塔杜·玛亚(Tadeu Maia)
2012年8月21日在22:59
我尝试了relaxedUrlToFileSystemMapping,但没有成功。我认为它不适用于最新版本的MVC。
–马克
13年7月24日在10:22
这使我能够捕获URL /WEB-INF./web.xml并将其重定向到自定义错误页面,而我尝试的其他许多方法均无效。
–quentin-starin
13-10-9在15:58
有趣。鉴于它对您不起作用,我将假设这对我不起作用...鉴于我使用的是.NET4.5的MVC4。但是宾果游戏还是成功了。就我而言,我只是有一个带有句点“。”的URL。作为最后一个字符。我得到了404,但这已经解决了。
– PandaWood
13年11月19日在3:15
他有安全感吗?
–Paesano2000
19年9月12日在18:50
#4 楼
在解决所有不同的补救措施后,我在这个问题上坚持了很长时间。我注意到,在包含点[。]的URL末尾添加正斜杠[/]时,它并没有引发404错误,并且可以正常工作。 br />我的URL看起来像这样:/Contact/~firstname.lastname,所以我的模式很简单:/Contact/~(.*[^/])$
我从Scott Forsyth那里得到了这个主意,请参见下面的链接:
http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path
评论
这对我有用(MVC5)。上面的其他建议没有用,也不需要,只是一个斜杠。我将按照@ jonduncan05的建议更改路线。
– markau
16年5月5日在1:57
谢谢你,莱昂为我节省了一天。不确定所有关于web.config的东西都是人们在这里谈论的,但是添加结尾/是我需要的答案。就我而言,我可以控制服务器端控制器以及调用它的javascript,因此我刚刚更新了JavaScript,瞧!
–青蛙王子
17 Mar 13 '17 10:44
#5 楼
只需将此部分添加到Web.config中,对路径/ {* pathInfo}的所有请求将由指定的处理程序处理,即使pathInfo中有点也是如此。 (摘自ServiceStack MVC主机Web.config示例和此答案https://stackoverflow.com/a/12151501/801189)通过修改'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>
评论
注意runAllManagedModulesForAllRequests(RAMMFAR)的性能后果。这将为每个请求启用所有托管模块。静态文件(例如图像)可以由IIS直接处理,但这会通过每个模块进行处理,从而增加了每个请求的开销。
–马克
13年5月19日在8:26
@分数。是的,但是我相信如果我们使用
– V.B.
13年5月19日在9:08
@ V.B。我认为仅处理程序就足够了,除非系统上有与.NET应该处理的URL相匹配的文件。由于某种原因,RAMMFAR在
–webXL
13年8月14日在15:52
当您不希望MVC处理对指定路由的请求并添加路由时,需要@webXL
– V.B.
13年8月14日在16:27
为什么不简单地添加处理程序工作?就我而言,我必须将RAMMFAR与处理程序一起添加。在这里寻找一些很好的解释。 :)
– Aditya Patil
15年3月17日在13:34
#6 楼
MVC 5.0解决方法。许多建议的答案似乎在MVC 5.0中不起作用。
由于最后一节中的404点问题可以通过关闭带有斜线的部分,这是我使用的小技巧,干净,简单。 >添加一些jquery / javascript以完成工作:
@Html.ActionLink("Change your Town", "Manage", "GeoData", new { id = User.Identity.Name }, null)
请注意结尾的斜杠,它负责更改
进入
<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>
#7 楼
对于仅在一个网页上具有此功能的用户来说,超级简单的答案。编辑您的操作链接,并在其末尾加上+“ /”。 @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |
评论
为我解决了!简洁大方!最令人恼火的是,在开发过程中Windows 10上不带'/'时就可以使用,但对于Windows 2012似乎是必需的。
–十个边缘饮料
17年11月14日在17:55
#8 楼
您可能要考虑使用破折号而不是句点。在Pro ASP MVC 3 Framework中,他们建议使用友好的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,甚至对于编写该应用程序的开发人员也会产生误导。
评论
可能是用户名或其他本质上包含点的字段。也就是说,StackOverflow会在用户网址中用破折号替换所有标点符号(包括。):P
– jli
2012年8月29日20:49
我遇到此问题是因为我拥有安全的文件检索服务,该服务显然在route参数中包含文件名...
– FlavorScape
13年5月2日在23:17
拒绝的原因很明显:它无法回答问题。如果可以的话,我不会让句点出现在我的URL中。之所以出现它们,是因为生成了URL,并且该URL必须是人类可读的。
– mg30rg
18-2-27在11:29
#9 楼
根据保留不带查询字符串的URI的重要性,您还可以仅将带点的值作为查询字符串(而不是URI)的一部分传递。 www.example.com/people?name=michael.phelps可以正常工作,而无需更改任何设置或任何其他内容。或添加任何设置或处理程序。#10 楼
是否可以更改您的URL结构?对于我正在研究的内容,我尝试了
url: "Download/{fileName}"
的路由,但由于任何带有。
我将路线切换为/>视图中的帮助者也都选择了它
routes.MapRoute(
name: "Download",
url: "{fileName}/Download",
defaults: new { controller = "Home", action = "Download", }
);
也可以链接到
localhost:xxxxx/File1.doc/Download
格式。也许您可以在路线的末尾添加不需要的单词,例如“ / view”或动作,以便您的财产以结尾的
localhost:xxxxx/File1.doc/Download
结尾,例如/
#11 楼
就像更改path =“一样简单。”到路径=“”。只需在web.config中删除ExensionlessUrlHandler-Integrated-4.0路径中的点即可。这是一篇不错的文章https://weblog.west-wind.com/posts/2015/Nov/13/在ASPNET MVC应用程序中提供带有文件扩展名的URL
评论
该链接使我找到了解决问题的最佳方法(该段包含一个“。”字符,但客户端不会以“ /”结尾)。通过在web.config的
–NickBeaugié
19年3月22日在9:58
#12 楼
尝试了以上所有解决方案,但没有一个对我有用。起作用的是我卸载了.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或所有那些非英语版本都在弄乱我的配置。
#13 楼
我可以使用https://stackoverflow.com/a/13082446/1454265上的解决方案并替换路径来解决此问题的特定版本(必须将/customer.html路由到/ customer,不允许使用斜杠) =“ *。html”。#14 楼
作为解决方案,也可以考虑将编码编码为不包含符号.
的格式,作为base64。 >在控制器中btoa(parameter);
#15 楼
将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>
#16 楼
另外,(相关)检查处理程序映射的顺序。我们在其后的路径中有一个带有.svc的.ashx(例如/foo.asmx/bar.svc/path)。 .svc映射首先是404,因此.svc路径在.asmx之前匹配。#17 楼
这是我在IIS 7.5和.NET Framework 4.5环境中发现错误404的最佳解决方案,并且没有使用:runAllManagedModulesForAllRequests =“ true”。 /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环境下运行良好。#18 楼
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");
}
}
}
评论
这如何回答OP的问题?请介意描述它?
– kayess
15年12月20日在16:23
这不是解决方案,而是一种黑客,需要将文件扩展名放置到uri路径中(无期限),例如“〜/ Image / jpg / cow”来检索文件“ / app_data / images / cow / jpg”-不是这个家伙和其他所有人都需要的解决方案。
–肖恩·威尔逊(Shaun Wilson)
16年1月21日在23:03
评论
真不敢相信我花了这么多时间在这上面。如果添加斜杠,则该URL可以正常工作。例如,www.example.com / people / michael.phelps /,但是如果没有斜杠IIS会抛出404错误。标记-这是因为IIS认为没有结尾斜杠,所以它应该去查找。添加斜杠的效果是...这不是真实文件。另外,下面的配置选项告诉IIS如果它不是文件,请尝试将其路由。
将项目更新为mvc 4 + asp.net 4.5后,我遇到了同样的问题。
作为一种变通方法,我正在使用IIS Rewrite将尾部斜杠添加到我的URL中。
这对我不起作用。该网址可以与“。”配合使用。在URL内,但在结尾时会出现错误