2015-01-10 1 views
0

При преобразовании веб-сайта с PHP на .NET я хочу иметь возможность поддерживать старые URL-адреса и перенаправлять их на новый MVVM. Такие ссылки встроены в документы, Wikis, сообщения в форумах и т. Д., Плюс пользователи имеют закладки, поэтому нецелесообразно просто конвертировать все во время миграции.Перенаправить URL с index.php на страницу ASP.NET вместо

Так 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 & param2 = y, и я хочу перенаправить на сайт www.mywebsite.com/Home/Redirect и сохранить параметры.

Обратите внимание, что я не с просьбой обращаться с PHP: я просто хочу в основном переписать URL-адрес.

Спасибо.

ответ

1

Позвольте мне добавить альтернативный ответ для потомков, поскольку он кажется более аккуратным, чем принятый ответ. Нам нужно было воссоздать сайт .php как сайт ASP.Net MVC и доставить 301 переадресацию на старые .php-страницы. Вот как мы решили проблему.

Шаг 1: добавьте следующий класс в проект MVC. Это не пространство имен, поэтому вы можете разместить его, где хотите. У нас есть «инфраструктурная» папка для таких классов.

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», который может быть глобальным.asax или в папке App_Start, и добавьте следующий игнорировать все запросы PHP ...

routes.IgnoreRoute("{resource}.php/{*pathInfo}"); 

Шаг три: в конце концов, вам нужно указать приложению использовать обработчик HTTP с шага один для обработки. php-запросы. Добавьте следующее в раздел <system.webServer> вашего web.config. Конечно, вы, конечно, уже настроили обработчики, и в этом случае не добавляйте элемент.

<handlers> 
    <add name="PHPRedirectHandler" path="*.php" verb="*" type="PHPRedirectHandler" resourceType="Unspecified" preCondition="integratedMode" /> 
</handlers> 

И это все, что мы сделали. Кажется, работает очень хорошо.

+0

Это выглядит точно, что мне нужно - спасибо. У меня есть странная проблема: установка контрольной точки в ProcessRequest и ее попадание, если url - index2.php, fred.php, index.php? Fred = 1 - но НЕ, если это просто index.php. Есть идеи? По общему признанию, я играл раньше, но я не могу найти никаких других текстовых ссылок на «php» в любом месте кода! Он перенаправляет себя на корень, как в «https: // localhost: 44303 /» – GeoffM

+0

На самом деле это не проблема, так как вся точка перенаправления здесь состоит в том, чтобы повернуть параметры после index.php в новую строку запроса, поэтому никаких параметров в любом случае не имеет никакого значения. Тем не менее все еще любопытно. Во всяком случае, принятый ответ изменился на этот, поскольку он отлично отвечает на вопрос. Еще раз спасибо. – GeoffM

1

Ну, у меня есть одно решение, однако я не могу передать параметры, ИЛИ 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> 

, который получает его на главный контроллер, Перенаправление метод , Но любые параметры, переданные исходному запросу, теряются.

Возможно, возможно, как я уже говорил, использовать Javascript для передачи параметров, но я не заинтересован в том, что число пользователей отключено. Использование a также возможно, но некоторые браузеры могут предупредить о том, что форма перенаправляется с параметрами, которые снова не идеальны.

+0

Логика говорит, что мне нужно изменить mimeType для обработки, как если бы это был обычный ASP, то есть с обработкой на стороне сервера, но мозг + Google не может вычислить! Есть идеи? – GeoffM

+0

Лично у меня нет решения, которое работает для меня полностью, и мне не нравится принимать мои собственные ответы. Но, возможно, кто-то найдет полезное. – GeoffM

+0

Это действительно работает для меня. Пробовал принятый ответ, но по какой-то причине не работал. – BenW

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

Работы действительно хорошо для меня.

Сообщите мне, если вам нужно больше объяснений по этому вопросу.