我有一个项目要求我的网址在路径中有点。例如,我可能有一个URL,例如www.example.com/people/michael.phelps
带点的网址生成404.我的路由很好。如果我通过michaelphelps,没有圆点,那么一切正常。如果我添加点我得到404错误。示例站点在带有IIS8 Express的Windows 7上运行。 URLScan未运行。
我尝试将以下内容添加到我的web.config:
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
不幸的是,这并没有什么不同。我刚收到404.0 Not Found错误。
这是一个MVC4项目,但我不认为这是相关的。我的路由工作正常,我期望的参数在那里,直到它们包含一个点。
我需要配置什么才能在网址中加点?
答案 0 :(得分:364)
我通过编辑我的网站的HTTP处理程序来完成这项工作。为了我的需要,这很有效并解决了我的问题。
我只是添加了一个新的HTTP处理程序,用于查找特定的路径条件。如果请求匹配,则将其正确发送到.NET进行处理。对于URLRewrite破解或启用RAMMFAR的解决方案,我感到非常高兴。
例如,要让.NET处理网址 www.example.com/people/michael.phelps ,请在system.webServer / handlers
元素中将以下行添加到您网站的web.config中:< / p>
<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处理。除非您有特定的案例,否则最好不要使用此选项。
答案 1 :(得分:46)
经过一番探索之后,我发现relaxUrlToFileSystemMapping对我来说根本不起作用,在我的情况下有效的是将RAMMFAR设置为true,同样适用于(.net 4.0 + mvc3)和(.net 4.5 + mvc4)
<system.webserver>
<modules runAllManagedModulesForAllRequests="true">
设置RAMMFAR true Hanselman post about RAMMFAR and performance
时请注意答案 2 :(得分:25)
我相信您必须在web.config中设置属性relaxedUrlToFileSystemMapping。不久前Haack写了一篇关于此事的文章(还有一些SO posts提出了同样类型的问题)
<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
答案 3 :(得分:23)
在没有用的情况下,我在所有不同的补救措施上长期坚持这个问题。
我注意到在向包含点[。]的URL的末尾添加正斜杠[/]时,它没有抛出404错误而且实际上有效。
我终于使用像IIS URL Rewrite这样的URL重写器来解决问题,以观察特定模式并附加训练斜杠。
我的网址如下所示:/Contact/~firstname.lastname所以我的模式很简单:/联系人/〜(。* [^ /])$
我从Scott Forsyth那里得到了这个想法,请看下面的链接: http://weblogs.asp.net/owscott/handing-mvc-paths-with-dots-in-the-path
答案 4 :(得分:21)
只需将此部分添加到Web.config,即使pathInfo中有点,指定处理程序也将处理对路径/ {* pathInfo}的所有请求。 (取自ServiceStack MVC Host Web.config示例和此答案https://stackoverflow.com/a/12151501/801189)
这应该适用于IIS 6和7.您可以在“路由”之后将特定处理程序分配给不同的路径。通过修改路径=&#34; *&#34;在&#39;添加&#39;元素
<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>
答案 5 :(得分: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/
答案 6 :(得分:4)
对于那些仅在一个网页上拥有此内容的人来说,这是一个非常简单编辑您的actionlink和+&#34; /&#34;在它的最后。
@Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |
答案 7 :(得分:2)
您可能想要考虑使用破折号而不是句号。
在Pro ASP MVC 3 Framework中,他们提出了关于制作友好网址的建议:
避免使用符号,代码和字符序列。如果你想要一个单词 分隔符,使用短划线(/ my-great-article)。下划线不友好, 和URL编码的空格是奇怪的(/我+伟大+文章)或恶心 (/我的%20great%20条)。
它还提到URL应该易于阅读和更改为人类。也许考虑使用破折号而不是点的理由也来自同一本书:
不要对HTML页面(.aspx或.mvc)使用文件扩展名,但要将它们用于特殊的文件类型(.jpg,.pdf,.zip等)。如果您正确设置MIME类型,Web浏览器不关心文件扩展名,但人们仍希望PDF文件以.pdf结尾
因此虽然人类仍然可以阅读一段时间(虽然不如破折号,IMO可读),但它可能仍然有点令人困惑/误导,具体取决于句点后的内容。如果有人有拉链的姓氏怎么办?然后URL将是/John.zip而不是/ John-zip,甚至可能误导了编写应用程序的开发人员。
答案 8 :(得分:2)
根据保留不带查询字符串的URI的重要性,您也可以仅将带点的值作为查询字符串(而不是URI)的一部分传递。
例如www.example.com/people?name=michael.phelps可以工作,而无需更改任何设置或任何内容。
您失去了拥有纯净URI的优雅,但是此解决方案不需要更改或添加任何设置或处理程序。
答案 9 :(得分:1)
是否可以更改您的网址结构?
为了我的工作,我尝试了
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
格式。
也许你可以把一个不需要的词放在&#34; / view&#34;或者在您的路线结束时执行操作,以便您的财产可以以/
/mike.smith/view
结尾
答案 10 :(得分:1)
尝试了上面的所有解决方案,但没有一个适合我。我卸载.NET版本的工作是什么&gt; 4.5,包括其所有多语言版本;最终我逐个添加了更新(仅英文版)的版本。现在我系统上安装的版本是:
此时它仍在工作。我害怕安装4.6.2,因为它可能会弄乱一切。
所以我只能推测4.6.2或所有那些非英文版本都搞砸了我的配置。
某人HTH。答案 11 :(得分:1)
这就像更改path =“ 一样简单。”到path =“ ”。只需在web.config中删除ExensionlessUrlHandler-Integrated-4.0路径中的点即可。
答案 12 :(得分:0)
我能够使用https://stackoverflow.com/a/13082446/1454265处的解决方案解决此问题的特定版本(必须使/customer.html路由到/ customer,不允许使用斜杠),并替换path =“*。html ”
答案 13 :(得分:0)
因为解决方案也可以考虑编码为不包含符号uid3
的格式,作为base64。
应添加js
.
在控制器中
btoa(parameter);
答案 14 :(得分:0)
此外,(相关)检查处理程序映射的顺序。我们在其后面的路径中有一个带有.svc(例如/foo.asmx/bar.svc/path)的.ashx。 .svc映射首先是404,因为.svc路径在.asmx之前匹配。 Havn没有想太多但是编写路径的url可以解决这个问题。
答案 15 :(得分:0)
这是我找到的针对IIS 7.5和.NET Framework 4.5环境中的错误404的最佳解决方案,并且没有使用: runAllManagedModulesForAllRequests =“ true” 。< / p>
我遵循了以下线程: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环境下运行良好。