将index.php的URL重定向到ASP.NET页面

时间:2015-01-10 18:38:38

标签: asp.net-mvc routes .net-4.5

在将网站从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&param2=y,我想重新路由到www.mywebsite.com/Home/Redirect并保留参数。< / p>

请注意,我要求处理PHP:我只是想基本上重写URL。

感谢。

3 个答案:

答案 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", ""));
        }

对我来说真的很好。

如果您需要更多解释,请告诉我。