diff --git a/src/Orchard.Tests.Modules/Widgets/RuleEngine/UrlRuleProviderTest.cs b/src/Orchard.Tests.Modules/Widgets/RuleEngine/UrlRuleProviderTest.cs index 7f0b05e46..e41b15821 100644 --- a/src/Orchard.Tests.Modules/Widgets/RuleEngine/UrlRuleProviderTest.cs +++ b/src/Orchard.Tests.Modules/Widgets/RuleEngine/UrlRuleProviderTest.cs @@ -61,5 +61,13 @@ namespace Orchard.Tests.Modules.Widgets.RuleEngine { _urlRuleProvider.Process(context); Assert.That(context.Result, Is.True); } + + [Test] + public void UrlForAboutPageWithEndingSlashMatchesAboutPagePath() { + _stubContextAccessor.StubContext = new StubHttpContext("~/About/"); + var context = new RuleContext { FunctionName = "url", Arguments = new[] { "~/about" } }; + _urlRuleProvider.Process(context); + Assert.That(context.Result, Is.True); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/UrlRuleProvider.cs b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/UrlRuleProvider.cs index 9f11ba7e9..b6fa22679 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/UrlRuleProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/RuleEngine/UrlRuleProvider.cs @@ -23,11 +23,17 @@ namespace Orchard.Widgets.RuleEngine { appPath = ""; url = string.Format("{0}/{1}", appPath, url); } - if (url != "/" && !url.Contains("?") && url.EndsWith("/")) + + if (!url.Contains("?")) url = url.TrimEnd('/'); + + var requestPath = context.Request.Path; + if (!requestPath.Contains("?")) + requestPath = requestPath.TrimEnd('/'); + ruleContext.Result = url.EndsWith("*") - ? context.Request.Path.ToUpperInvariant().StartsWith(url.TrimEnd('*').ToUpperInvariant()) - : context.Request.Path.ToUpperInvariant() == url.ToUpperInvariant(); + ? requestPath.StartsWith(url.TrimEnd('*'), StringComparison.OrdinalIgnoreCase) + : string.Equals(requestPath, url, StringComparison.OrdinalIgnoreCase); } } } \ No newline at end of file