From e587084c620ac538f1c69f44cdbf634c9a0bb6d3 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 6 Feb 2025 14:41:58 +0800 Subject: [PATCH 1/4] Remove index.md from path --- docs/en/docs-nav.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 8ca147a3db..4526694a32 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -130,7 +130,7 @@ { "text": "Book Store Application (with ABP Suite)", "isLazyExpandable": true, - "path": "tutorials/book-store-with-abp-suite/index.md", + "path": "tutorials/book-store-with-abp-suite", "items": [ { "text": "Overview", @@ -162,11 +162,11 @@ { "text": "Modular Monolith Application", "isLazyExpandable": true, - "path": "tutorials/modular-crm/index.md", + "path": "tutorials/modular-crm", "items": [ { "text": "Overview", - "path": "tutorials/modular-crm/index.md", + "path": "tutorials/modular-crm", "isIndex": true }, { @@ -206,11 +206,11 @@ { "text": "Microservice Solution", "isLazyExpandable": true, - "path": "tutorials/microservice/index.md", + "path": "tutorials/microservice", "items": [ { "text": "Overview", - "path": "tutorials/microservice/index.md", + "path": "tutorials/microservice", "isIndex": true }, { @@ -246,19 +246,19 @@ { "text": "Mobile Application Development", "isLazyExpandable": true, - "path": "tutorials/mobile/index.md", + "path": "tutorials/mobile", "items": [ { "text": "Overview", - "path": "tutorials/mobile/index.md" + "path": "tutorials/mobile" }, { "text": "MAUI", - "path": "tutorials/mobile/maui/index.md" + "path": "tutorials/mobile/maui" }, { "text": "React Native", - "path": "tutorials/mobile/react-native/index.md" + "path": "tutorials/mobile/react-native" } ] }, @@ -2627,7 +2627,7 @@ }, { "text": "Knowledge Base", - "path": "kb/index.md" + "path": "kb" }, { "text": "Penetration Test Report", From 911fcc8c59ab60f84cda6610b6b67a444ff5b4f8 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 6 Feb 2025 15:01:04 +0800 Subject: [PATCH 2/4] Permanent redirect if URLs ending with /index --- .../Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index d6acd8c262..c2440c9b5f 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -131,6 +131,12 @@ namespace Volo.Docs.Pages.Documents.Project return Redirect(decodedUrl); } + if(displayUrl.EndsWith("/Index", StringComparison.OrdinalIgnoreCase)) + { + displayUrl = displayUrl.Substring(0, displayUrl.LastIndexOf("/Index", StringComparison.OrdinalIgnoreCase)); + return RedirectPermanent(displayUrl); + } + return await SetPageAsync(); } From b448b63bf809d8449542677e44dfbef75cca2fcc Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 6 Feb 2025 15:40:50 +0800 Subject: [PATCH 3/4] Add RedirectUrlResolver --- modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs | 15 +++++++++++++++ .../Pages/Documents/Project/Index.cshtml.cs | 6 +++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs b/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs index 702536c31d..e06fa94bc2 100644 --- a/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs +++ b/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs @@ -39,6 +39,21 @@ namespace Volo.Docs public bool EnableEnlargeImage { get; set; } = true; + public Func RedirectUrlResolver { get; set; } = url => + { + if (!url.EndsWith("/Index", StringComparison.OrdinalIgnoreCase)) + { + return null; + + } + return url.Substring(0, url.LastIndexOf("/Index", StringComparison.OrdinalIgnoreCase)); + }; + + public string? GetRedirectUrlIfNeeded(string url) + { + return RedirectUrlResolver.Invoke(url); + } + private string GetFormattedRoutePrefix() { if (string.IsNullOrWhiteSpace(_routePrefix)) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index c2440c9b5f..2bb7c82c21 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -131,10 +131,10 @@ namespace Volo.Docs.Pages.Documents.Project return Redirect(decodedUrl); } - if(displayUrl.EndsWith("/Index", StringComparison.OrdinalIgnoreCase)) + var redirectUrl = _uiOptions.GetRedirectUrlIfNeeded(displayUrl); + if (redirectUrl != null) { - displayUrl = displayUrl.Substring(0, displayUrl.LastIndexOf("/Index", StringComparison.OrdinalIgnoreCase)); - return RedirectPermanent(displayUrl); + return RedirectPermanent(redirectUrl); } return await SetPageAsync(); From 24b0f91d5bd87868658efaed194b1d7fc707eb65 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 6 Feb 2025 16:29:21 +0800 Subject: [PATCH 4/4] Add DocumentLinksNormalizer --- modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs | 10 ++++++++++ .../Volo.Docs.Web/Utils/DefaultDocsLinkGenerator.cs | 9 +++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs b/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs index e06fa94bc2..a6b06768c3 100644 --- a/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs +++ b/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs @@ -38,6 +38,16 @@ namespace Volo.Docs public SingleProjectModeOptions SingleProjectMode { get; } = new (); public bool EnableEnlargeImage { get; set; } = true; + + public Func DocumentLinksNormalizer { get; set; } = link => + { + if (!link.EndsWith("/Index", StringComparison.OrdinalIgnoreCase)) + { + return link; + + } + return link.Substring(0, link.LastIndexOf("/Index", StringComparison.OrdinalIgnoreCase)); + }; public Func RedirectUrlResolver { get; set; } = url => { diff --git a/modules/docs/src/Volo.Docs.Web/Utils/DefaultDocsLinkGenerator.cs b/modules/docs/src/Volo.Docs.Web/Utils/DefaultDocsLinkGenerator.cs index bc91e17848..c3934ec16f 100644 --- a/modules/docs/src/Volo.Docs.Web/Utils/DefaultDocsLinkGenerator.cs +++ b/modules/docs/src/Volo.Docs.Web/Utils/DefaultDocsLinkGenerator.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Net; using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Docs.Pages.Documents.Project; @@ -9,10 +10,13 @@ namespace Volo.Docs.Utils; public class DefaultDocsLinkGenerator : IDocsLinkGenerator, ITransientDependency { protected LinkGenerator LinkGenerator { get; } + + protected IOptions DocsUiOptions { get; } - public DefaultDocsLinkGenerator(LinkGenerator linkGenerator) + public DefaultDocsLinkGenerator(LinkGenerator linkGenerator, IOptions docsUiOptions) { LinkGenerator = linkGenerator; + DocsUiOptions = docsUiOptions; } @@ -26,6 +30,7 @@ public class DefaultDocsLinkGenerator : IDocsLinkGenerator, ITransientDependency }; var encodedUrl = LinkGenerator.GetPathByPage("/Documents/Project/Index", values: routeValues); - return encodedUrl?.Replace("%2F", "/"); //Document name can contain path separator(/), so we need to decode it. + var url = encodedUrl?.Replace("%2F", "/"); //Document name can contain path separator(/), so we need to decode it. + return DocsUiOptions.Value.DocumentLinksNormalizer?.Invoke(url); } } \ No newline at end of file