我有一个MVC模式,为了向后兼容网站迁移,我需要支持两个特定的.php文件。 One(mywebsite.com/aFolder/select.php)表现完美:使用正确的操作调用控制器。另一个没有(mywebsite.com/index.php)。在后一种情况下,浏览器只是重定向(或重定向)到mywebsite.com(默认的Home控制器,Index方法)。
我的RouteConfig.cs:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
name: "php2",
url: "aFolder/select.php",
defaults: new { controller = "Testtt", action = "Foo" }
);
routes.MapRoute(
name: "php1",
url: "index.php",
defaults: new { controller = "Testtt", action = "Foo" }
);
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
我的Web.config:
<system.webServer>
<handlers>
<add name="PhpHandler1" path="index.php" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="PhpHandler2" path="aFolder/select.php" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
FWIW控制器:
public class TestttController : Controller
{
public ActionResult Foo()
{
return View();
}
}
(在Foo中设置一个断点会在/aFolder/select.php上被击中而在/index.php上没有被击中)
关于index.php位于根目录而不是使其行为不同的子文件夹。有什么想法吗?
答案 0 :(得分:0)
经过几个月(开启和关闭)以及过去几天的密集讨论后,我最终找到了另一种方法 - 仍然是URL重写但不是通过使用web.config规则。忽略我的OP - 这对于我需要处理的两个.php页面请求来说要简单得多。这里提供的对某人可能有用。
web.config中的处理程序:
<add name="PhpHandler1" path="index.php" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="PhpHandler2" path="Foo/select.php" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
的Global.asax.cs:
protected void Application_BeginRequest(object sender, EventArgs e)
{
string fullOriginalpath = Request.Url.ToString();
if (fullOriginalpath.Contains("index.php"))
{
Context.RewritePath("/Redirect/Index");
}
[...+select.php, etc...]
}
为简洁起见简化,未显示错误/异常处理。然后是一个名为RedirectHandler的标准控制器,其索引返回ActionResult(或其他)。