使用 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", ""));
}
对我来说效果很好。
如果您需要更多解释,请告诉我。
在将网站从 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", ""));
}
对我来说效果很好。
如果您需要更多解释,请告诉我。