我见过很多类似的问题,但他们都关注我已经完成的这项任务的第一部分。如果我错过了一个回答我的问题,请告诉我。
我有一台运行ASP .NET MVC5站点的IIS 7.5服务器。作为我添加的路线的一部分:
routes.MapRoute(
name: "Default",
url:"{*url}",
defaults: new { controller = "Home", action = "NotFound" }
);
此路线充当我的404行动。
另外在我的web.config中我有:
<modules runAllManagedModulesForAllRequests="true">
其中的重点是我现在将我的404正常定义为MVC操作,但它响应所有URL,包括以下内容:
/error
/err.or
/e/r/r/o/r
然而今天我注意到,如果我尝试这条路线它会失败:
/error.
也就是说任何ENDS带有句点或点的路径都给出了典型的:
Server Error in '/' Application.
The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.
Requested URL: /error.
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34280
我在另一个项目中有类似的设置,它适用于以点结尾的URL,但我无法弄清楚这两个项目之间有什么不同。我有什么想法可能做错了吗?或者是什么捕获了这条路线?或者什么是通过ASP .Net处理这条路线?
答案 0 :(得分:3)
最有可能的,罪魁祸首是你没有启用设置:
<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
</system.web>
注意:根据this page,如果
runAllManagedModulesForAllRequests
位于.
的末尾,则无需启用/Home/NotFound
(这会影响效果)查询字符串。
如果这不起作用,有效地解决问题的一种方法是简单地使用URL Rewrite Module重写路径以点为<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite . at end of URL path to /Home/NotFound" stopProcessing="true">
<match url="^.*\.(?:/?\?.*)?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/Home/NotFound" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
的任何URL。这样就不需要首先回复302后跟404(这对SEO不利)。
/Home/NotFound
这假设响应{{1}}的操作方法正确地将HTTP状态代码设置为404.
参考文献: