C# .Net核心重写严格的Url

C# .Net核心重写严格的Url,c#,url-rewriting,.net-core,C#,Url Rewriting,.net Core,我在.NETCore2.1上做了一个项目,在那里我重写URL,比如 var rewrites = new RewriteOptions() .AddRewrite(@"GetCountryInfo", "Home/GetCountryInfo", skipRemainingRules: true) .AddRewrite(@"about-us", "Home/About", skipRemainingRules: t

我在.NETCore2.1上做了一个项目,在那里我重写URL,比如

var rewrites = new RewriteOptions()
                    .AddRewrite(@"GetCountryInfo", "Home/GetCountryInfo", skipRemainingRules: true)
                    .AddRewrite(@"about-us", "Home/About", skipRemainingRules: true)
                    .AddRewrite(@"pricing", "Home/Pricing", skipRemainingRules: true)
                    .AddRewrite(@"sign-in", "Home/Sign_in", skipRemainingRules: true)
                    .AddRewrite(@"sign-up", "Home/Sign_up", skipRemainingRules: true)
它的工作很好,但当一些东西添加这个网址,然后它的工作,这是不可接受的


我想忽略此/abc或url中的1。我怎样才能做到这一点

最后我用两种方法解决了这个问题。现在我将详细描述

  • 实施规则:
  • 我编写了一个从IRule继承的类,比如

    public class UrlRules : IRule
        {
            public void ApplyRule(RewriteContext context)
            {
                var request = context.HttpContext.Request;
                if (!IsValidUrl(request.Path))
                {
                    var response = context.HttpContext.Response;
                    response.StatusCode = StatusCodes.Status404NotFound;
                    context.Result = RuleResult.EndResponse;
                    response.Headers[HeaderNames.Location] = "/home/error";
    
                }
            }
            public bool IsValidUrl(string path)
            {
                bool urlValid = false;
                switch (path)
                {
                    case "/":
                    case "/about-us":
                    case "/about-us/":
                    case "/GetCountryInfo":
                    case "/pricing":
                    case "/pricing/":
                    case "/sign-in":
                    case "/sign-in/":
                    case "/sign-up":
                    case "/sign-up/":
                        urlValid = true;
                        break;
                    default:
                        urlValid = false;
                        break;
                }
                return urlValid;
            }
        }
    
    然后将路由配置为

    app.UseMvc(routes =>
                {
                    var rewrites = new RewriteOptions()
                        .Add(new UrlRules())
                        .AddRewrite(@"GetCountryInfo", "Home/GetCountryInfo", skipRemainingRules: true)
                        .AddRewrite(@"about-us", "Home/about", skipRemainingRules: true)
                        .AddRewrite(@"pricing", "Home/Pricing", skipRemainingRules: true)
                        .AddRewrite(@"sign-in", "Home/Sign_in", skipRemainingRules: true)
                        .AddRewrite(@"sign-up", "Home/Sign_up", skipRemainingRules: true);
    
    
                    app.UseRewriter(rewrites);
                    routes.MapRoute(
                        name:"default",
                        template: "{controller=Home}/{action=Index}/{id?}");
                });
    
    它起作用了

  • 定义路线:
  • 这是对我最好的方式。只是在每个动作中定义路线,如下所示

    [Route("~/about-us")]
            public IActionResult About()
            {
                return View();
            }
    
    这对我来说是个完美的解决方案,因为它工作得很好

    [Route("~/about-us")]
            public IActionResult About()
            {
                return View();
            }