在将网站从PHP转换为.NET时,我希望能够支持旧URL并将它们重定向到新的MVVM。这些链接嵌入在文档,维基,论坛帖子等中,而且用户也有书签,因此在迁移过程中转换所有内容是不可行的。
所以在App_Start RouteConfig RegisterRoutes中我有:
routes.MapRoute("index.php", "Home/Redirect");
在我的家庭控制器中,我有:
public ActionResult Redirect()
{
ViewBag.Message = "Redirect";
return View();
}
和Redirect.cshtml:
<h2>Redirect</h2>
<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message</h3>
显然上面做的很少,但更重要的是,运行它并进入
https://localhost:44303/index.php
因为URL产生404错误。但是如果我理解正确的话,我想我添加了一条自定义路线?我是否需要在某处注册.php作为有效的扩展名?
总结一下:网址为www.mywebsite.com/index.php?param1=x¶m2=y,我想重新路由到www.mywebsite.com/Home/Redirect并保留参数。< / p>
请注意,我不要求处理PHP:我只是想基本上重写URL。
感谢。
答案 0 :(得分:1)
好吧,我有一个解决方案,但是我无法传递参数, OR 必须启用Javascript。对我来说都不是理想的。
在网站的web.config中:
<system.webServer>
<staticContent>
<remove fileExtension=".php" />
<mimeMap fileExtension=".php" mimeType="text/html" />
</staticContent>
</system.webServer>
然后,在项目的根目录中,使用以下命令创建index.php:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Redirecting...</title>
<meta http-equiv="refresh" content ="5; url=/Home/Redirect">
</head>
<body>
Redirecting - please wait.
</body>
</html>
这将它带到Home控制器,Redirect方法。但传递给原始请求的任何参数都会丢失。
如上所述,显然有可能使用Javascript传递参数,但由于关闭它的用户数量,我并不热衷。显然也可以使用a,但有些浏览器可能会警告某个表单被重定向的参数再次不理想。
答案 1 :(得分:1)
让我为后代添加一个替代答案,因为它似乎比接受的答案更整洁。我们需要将.php站点重新创建为ASP.Net MVC站点,并为旧的.php页面提供301重定向。以下是我们如何解决问题的方法。
步骤1:将以下类添加到MVC项目中。这不是命名空间,因此您可以将它放在任何您喜欢的位置。我们有一个&#34;基础设施&#34;像这样的类的文件夹。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
public class PHPRedirectHandler: IHttpHandler
{
bool IHttpHandler.IsReusable
{
get { return false; }
}
void IHttpHandler.ProcessRequest(HttpContext context)
{
string originalUrl = context.Request.Url.PathAndQuery;
int index = originalUrl.ToLower().IndexOf(".php");
if (index >= 0)
{
string page = context.Request.Url.PathAndQuery;
var urlHelper = new UrlHelper(context.Request.RequestContext);
string newUrl;
switch (page)
{
case "/about.php":
newUrl = urlHelper.Action("About", "Home");
break;
default:
newUrl = urlHelper.Action("Index", "Home");
break;
}
context.Response.Status = "301 Moved Permanently";
context.Response.AddHeader("Location", newUrl);
context.Response.End();
}
}
}
第二步:默认情况下,MVC路由会尝试将PHP页面的请求发送到控制器,因此您需要明确忽略这些请求。找到你的&#34; RegisterRoutes&#34;方法,可以在global.asax或App_Start文件夹中,并添加以下内容以忽略所有PHP请求...
routes.IgnoreRoute("{resource}.php/{*pathInfo}");
第三步:最后,您需要告诉应用程序使用第一步中的HTTP处理程序来处理.php请求。将以下内容添加到web.config的<system.webServer>
部分。您当然可以设置处理程序,在这种情况下不要添加元素。
<handlers>
<add name="PHPRedirectHandler" path="*.php" verb="*" type="PHPRedirectHandler" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
这就是我们所做的一切。似乎工作得很好。
答案 2 :(得分:0)
我能够处理如下。
首先,在web.config文件中有一个处理程序。
<add name="PHPRedirectHandler" path="*.php" verb="*" type="PHPRedirectHandler" resourceType="Unspecified" preCondition="integratedMode" />
并且在您的控制器中具有以下条件。您只需检查扩展名,如果它有.php,然后将其删除并重定向。
if (temp_url.IndexOf(".php") != -1)
{
return Redirect(temp_url.Replace(".php", ""));
}
对我来说真的很好。
如果您需要更多解释,请告诉我。