我将我的网站从纯HTML文件路径重写为MVC 4无扩展网址。
现在我想实现规则,将所有请求重定向到旧的.html
文件到我的主页。
在routeConfig.cs
我尝试了这个:
routes.MapRoute(
name: "Redirects",
url: "posts/{page}.html",
defaults: new { controller = "Home", action = "Index" }
);
但是,无论我尝试什么,我都会获得404.我看起来MVC正在处理.html文件并忽略我的Route
条目。
我也尝试过:
routes.IgnoreRoute( “帖子/ {文件}的.html”);
告诉MVC不处理.html文件,但仍然没有运气。
任何想法我做错了什么?
答案 0 :(得分:2)
请根据以下代码段将routes.RouteExistingFiles设为true。
routes.RouteExistingFiles = true;
routes.MapRoute(name: "Redirects",
url: "HtmlPage.html",
defaults: new { controller = "Home", action = "Html", page = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
同时编辑您的web.config并将PageHandlerFactory-Integrated-HTML处理程序添加到处理程序列表中,如下面的代码片段所示。
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="PageHandlerFactory-Integrated-HTML" path="*.html"
verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory"
resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
答案 1 :(得分:1)
请尝试这样,路由现有文件我完成的RegisterRoutes调用如下所示(如this post中所述):
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.RouteExistingFiles = true;
routes.MapRoute(
name: "CrazyPants",
url: "{page}.html",
defaults: new { controller = "Home", action = "Html", page = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
答案 2 :(得分:1)
由于您正在从HTML迁移到MVC,我认为您不应该将迁移作为应用程序的一部分。 而是使用URL重写模块(URL Rewrite)来重定向请求。
您可以使用IIS管理控制台配置重定向规则,或直接编辑web.config。
以下是web.config中可能与您的案例相关的规则示例:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Html to MVC" stopProcessing="true">
<match url=".*/(.*).html" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" />
</conditions>
<action type="Redirect" url="/Index/{R:1}" redirectType="Found" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
它可能不是您需要的完美规则(进行一些测试和调整),但我相信这是您需要的方式。这样你就可以在某个时候最终摆脱HTML重定向,它不会成为你应用程序的一部分;这也意味着您无需重新编译应用程序即可进行更改。