diff --git a/src/Orchard/Mvc/Extensions/ControllerExtensions.cs b/src/Orchard/Mvc/Extensions/ControllerExtensions.cs index 904aae4d5..ddec70712 100644 --- a/src/Orchard/Mvc/Extensions/ControllerExtensions.cs +++ b/src/Orchard/Mvc/Extensions/ControllerExtensions.cs @@ -2,13 +2,15 @@ using System.Web; using System.Web.Mvc; using Orchard.Utility.Extensions; +using Orchard.Environment.Configuration; namespace Orchard.Mvc.Extensions { public static class ControllerExtensions { public static ActionResult RedirectLocal(this Controller controller, string redirectUrl, Func invalidUrlBehavior) { if (!string.IsNullOrWhiteSpace(redirectUrl) && controller.Request.IsLocalUrl(redirectUrl)) { - return new RedirectResult(redirectUrl); + return RedirectWithTenantPrefix(redirectUrl, controller); } + return invalidUrlBehavior != null ? invalidUrlBehavior() : null; } @@ -18,10 +20,25 @@ namespace Orchard.Mvc.Extensions { public static ActionResult RedirectLocal(this Controller controller, string redirectUrl, string defaultUrl) { if (controller.Request.IsLocalUrl(redirectUrl)) { - return new RedirectResult(redirectUrl); + return RedirectWithTenantPrefix(redirectUrl, controller); } - return new RedirectResult(defaultUrl ?? "~/"); + return RedirectWithTenantPrefix(defaultUrl ?? "~/", controller); + } + + private static ActionResult RedirectWithTenantPrefix(string redirectUrl, Controller controller) { + if (redirectUrl.StartsWith("~/")) { + ShellSettings settings; + var context = controller.ControllerContext.GetWorkContext(); + + if (context != null && + context.TryResolve(out settings) && + !string.IsNullOrWhiteSpace(settings.RequestUrlPrefix)) { + redirectUrl = VirtualPathUtility.ToAbsolute(redirectUrl, controller.Request.ApplicationPath.TrimEnd('/') + "/" + settings.RequestUrlPrefix); + } + } + + return new RedirectResult(redirectUrl); } } }