diff --git a/src/Orchard.Tests/Environment/RunningShellTableTests.cs b/src/Orchard.Tests/Environment/RunningShellTableTests.cs index beedceeaa..38f128ede 100644 --- a/src/Orchard.Tests/Environment/RunningShellTableTests.cs +++ b/src/Orchard.Tests/Environment/RunningShellTableTests.cs @@ -135,6 +135,7 @@ namespace Orchard.Tests.Environment { Assert.That(table.Match(new StubHttpContext("~/foo/bar", "wiki.example.com")), Is.EqualTo(settingsA).Using(new ShellComparer())); Assert.That(table.Match(new StubHttpContext("~/bar/foo", "wiki.example.com")), Is.EqualTo(settingsB).Using(new ShellComparer())); + Assert.That(table.Match(new StubHttpContext("~/", "wiki.example.com")), Is.EqualTo(settingsG).Using(new ShellComparer())); Assert.That(table.Match(new StubHttpContext("~/baaz", "wiki.example.com")), Is.EqualTo(settingsG).Using(new ShellComparer())); Assert.That(table.Match(new StubHttpContext("~/foo/bar", "www.example.com")), Is.EqualTo(settings).Using(new ShellComparer())); Assert.That(table.Match(new StubHttpContext("~/bar/foo", "www.example.com")), Is.EqualTo(settings).Using(new ShellComparer())); @@ -149,6 +150,21 @@ namespace Orchard.Tests.Environment { Assert.That(table.Match(new StubHttpContext("~/yarg", "a.example.com")), Is.Null); } + [Test] + public void PathAndHostMustMatchOnFullUrl() { + var table = (IRunningShellTable)new RunningShellTable(); + var settings = new ShellSettings { Name = ShellSettings.DefaultName, RequestUrlHost = "www.example.com", }; + var settingsB = new ShellSettings { Name = "Beta", RequestUrlHost = "wiki.example.com", RequestUrlPrefix = "bar" }; + var settingsG = new ShellSettings { Name = "Gamma", RequestUrlHost = "wiki.example.com" }; + table.Add(settings); + table.Add(settingsB); + table.Add(settingsG); + + Assert.That(table.Match(new StubHttpContext("~/bar/foo", "wiki.example.com")), Is.EqualTo(settingsB).Using(new ShellComparer())); + Assert.That(table.Match(new StubHttpContext("~/", "wiki.example.com")), Is.EqualTo(settingsG).Using(new ShellComparer())); + Assert.That(table.Match(new StubHttpContext("~/baaz", "wiki.example.com")), Is.EqualTo(settingsG).Using(new ShellComparer())); + Assert.That(table.Match(new StubHttpContext("~/barbaz", "wiki.example.com")), Is.EqualTo(settingsG).Using(new ShellComparer())); + } [Test] public void PathAloneWillMatch() { var table = (IRunningShellTable)new RunningShellTable(); diff --git a/src/Orchard/Environment/RunningShellTable.cs b/src/Orchard/Environment/RunningShellTable.cs index f4eb59395..48de1dc9b 100644 --- a/src/Orchard/Environment/RunningShellTable.cs +++ b/src/Orchard/Environment/RunningShellTable.cs @@ -93,7 +93,18 @@ namespace Orchard.Environment { .Where(group => host.EndsWith(group.Key, StringComparison.OrdinalIgnoreCase)) .SelectMany(group => group .OrderByDescending(settings => (settings.RequestUrlPrefix ?? string.Empty).Length)) - .FirstOrDefault(settings => settings.State.CurrentState != TenantState.State.Disabled && appRelativePath.StartsWith("~/" + (settings.RequestUrlPrefix ?? string.Empty), StringComparison.OrdinalIgnoreCase)); + .FirstOrDefault(settings => { + if (settings.State.CurrentState == TenantState.State.Disabled) { + return false; + } + + if (String.IsNullOrWhiteSpace(settings.RequestUrlPrefix)) { + return true; + } + + return appRelativePath.StartsWith("~/" + settings.RequestUrlPrefix + "/", StringComparison.OrdinalIgnoreCase) + || appRelativePath.Equals("~/" + settings.RequestUrlPrefix, StringComparison.OrdinalIgnoreCase); + }); return mostQualifiedMatch ?? _fallback; }