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

Redirect URL with index.php to an ASP.NET page instead

在将网站从 PHP 转换为 .NET 时,我希望能够支持旧的 URL 并将它们重定向到新的 MVVM。这些链接嵌入在文档、Wiki、论坛帖子等中,再加上用户有书签,因此在迁移过程中只转换所有内容是不可行的。

所以在 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 作为有效扩展名吗?

总结一下:URL 以 www.mywebsite.com/index.php?param1=x¶m2=y 的形式出现,我想重新路由到 www.mywebsite.com/Home/Redirect 并保留参数.

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

谢谢。

好吧,我有一个解决方案,但是我无法传递参数,必须启用 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 ,但某些浏览器可能会警告使用参数重定向的表单,这又是不理想的。

让我在这里为后代添加一个替代答案,因为它看起来比接受的答案更整洁。我们需要重新创建一个 .php 站点作为 ASP.Net MVC 站点,并为旧的 .php 页面提供 301 重定向。这是我们解决问题的方法。

第 1 步:将以下 class 添加到您的 MVC 项目中。这不是命名空间,所以你可以把它放在任何你喜欢的地方。我们有一个 "infrastructure" 文件夹供 class 像这样。

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 页面的请求发送到控制器,因此您需要明确忽略这些请求。找到您的 "RegisterRoutes" 方法,它可能在 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>

这就是我们所做的一切。看起来效果不错。

我能够按如下方式处理。

首先,在您的 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", ""));
        }

对我来说效果很好。

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