Как перехватить внешние гиперссылки в MVC3

У меня есть ситуация, когда два веб-сайта используют одни и те же данные (основная версия и мобильная версия). Итак, на некоторых страницах основной версии у меня есть внутренние ссылки, такие как www.domain.com/link1... Но когда мобильная версия использует ту же гиперссылку, она направляет пользовательский контекст на основной сайт, но мне нужно перехватить этот запрос и обработать его и перенаправить пользователя туда, куда мне нужно в случае мобильной версии.

Скажем, в основной версии сайта на странице www.domain.com/about/strategy.aspx (webforms) у меня есть абсолютный URL-адрес www.domain.com/services/item.aspx?Id=1256, и это нормально. Но когда я получил ту же страницу на mobile.domain.com/about/strategy (mvc), я хочу изменить ссылку www.domain.com/services/item.aspx?Id=1256 на mobile.domain.com/services/1256. . Проблема в том, что у меня есть> 10000 страниц с абсолютными URL-адресами, и контент-менеджеры сойдут с ума, справляясь с этой проблемой.

Есть идеи?


person Roman    schedule 21.03.2013    source источник


Ответы (4)


Вероятно, если вы ищете удобные для пользователя URL-адреса в веб-формах, то ответом будет переписывание URL-адресов.

Для этой функциональности вы можете найти сторонние библиотеки DLL с открытым исходным кодом.

Дайте мне знать, если я ошибся с тем, что вам нужно. :)

person Hiren Desai    schedule 21.03.2013

Вы можете ознакомиться с этой статьей:

http://www.iis.net/learn/extensions/url-rewrite-module/developing-a-custom-rewrite-provider-for-url-rewrite-module

person Stefano Altieri    schedule 21.03.2013

Я могу думать о двух возможных решениях, все они требуют javasctipt:

  1. У вас есть функция js, которая переопределяет URL-адреса на ваших страницах.
  2. У вас есть обработчик js, который будет ловить клики и перенаправлять пользователя на действие вашего сервера, где вы перенаправите его туда, куда хотите.
person Dima    schedule 21.03.2013

Я вручную заменил абсолютные URL-адреса в БД, например, www.domain.com/services/service.aspx?Id=1000 становится /services/service.aspx?Id=1000, используя метод замены SQL. А затем реализовал RewritingModule с помощью Dictionary.

public class RewritingModule : IHttpModule
    {
        /// <summary>
        /// Инициализация
        /// </summary>
        /// <param name="application"></param>
        public void Init(HttpApplication application)
        {
            application.BeginRequest += ApplicationBeginRequest;
        }

        private static void ApplicationBeginRequest(object sender, EventArgs e)
        {
            var _httpContext = HttpContext.Current;

            foreach (KeyValuePair<string, string> item in DictionaryRewrites)
            {
                var currentUrl = _httpContext.Request.RawUrl;
                string itemKey = item.Key;

                if (currentUrl.Equals(itemKey, StringComparison.OrdinalIgnoreCase))
                {
                    Process301Redirect(_httpContext, item.Value);
                    break;
                }
            }

        }

        private static Dictionary<string, string> DictionaryRewrites = new Dictionary<string, string>() 
        { 
            { "/Services/Pavilions/Item.aspx?ItemID=5", "/exhibitions/pavillions/3/hall4" },
            { "/Services/ConferenceHalls/Item.aspx?ItemID=10127", "/conferences/conferencehalls/1/conferencehall1" }

        };

        /// <summary>
        /// 301 Redirect
        /// </summary>
        /// <param name="context"></param>
        /// <param name="toRedirect"></param>
        private static void Process301Redirect(HttpContext context, string toRedirect)
        {
            var _localizationSettings = EngineContext.Current.Resolve<LocalizationSettings>();
            var _workContext = EngineContext.Current.Resolve<IWorkContext>();
            var _httpContext = HttpContext.Current;
            var _webHelper = EngineContext.Current.Resolve<IWebHelper>();
            string applicationPath = _httpContext.Request.ApplicationPath;

            if (_localizationSettings.SeoFriendlyUrlsForLanguagesEnabled)
            {
                toRedirect = toRedirect.AddLanguageSeoCodeToRawUrl(applicationPath, _workContext.WorkingLanguage);
            }

            string str = _webHelper.GetApplicationLocation() + toRedirect;
            context.Response.AddHeader("Location", str);
            context.Response.Status = "301 Moved Permanently";
        }

        public void Dispose()
        {
            //clean-up code here.
        }
    }
person Roman    schedule 22.03.2013