2016-12-18 68 views
4

下面是我用於ASP.NET Core 1.1 Url重寫中間件從www重定向的核心。非網址:ASP.NET Core 1.1網址重寫 - www非網址

var options = new RewriteOptions() 
    .AddRedirect("^(www\\.)(.*)$", "$2"); 
app.UseRewriter(options); 

由於某種原因,它不起作用。我知道正則表達式是正確的。這裏有什麼問題?

下面是完整的配置功能:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     app.UseRequestLocalization(new RequestLocalizationOptions() { DefaultRequestCulture = new RequestCulture("ru-ru") }); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      // URL Rewriting 
      var options = new RewriteOptions() 
       //.AddRedirect(@"^(https?:\/\/)(www\.)(.*)$", "$1$3"); 
       .AddRedirect("^(www\\.)(.*)$", "$2"); 
      app.UseRewriter(options); 

      app.UseExceptionHandler("/Home/Error"); 
     } 

     app.UseStaticFiles(); 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
        name: "default", 
        template: "{action=Index}/{id?}", 
        defaults: new { controller = "Home" } 
        ); 
     }); 
    } 
+1

你爲什麼確定這個正則表達式是正確的? 「www \\」的含義類似於「www \ .example.com」。順便說一下[這個工具](https://regex101.com/r/g7pU6F/1)可以幫助你。 –

+0

是的,這是正確的 - ^(www \。)(。*)$,我必須逃脫「點」 – alvipeo

+1

@ChristianGollhardt \\是C#字符串,它轉換爲\爲正則表達式。 –

回答

2

的問題是.AddRedirect和.AddRewrite僅看一個URL路徑/查詢字符串。所以你的正則表達式是正確的,但是該方法只查看路徑/查詢,所以它永遠不會看到www。這種行爲對於大多數重寫器都是標準的,比如Apache mod_rewrite和IIS UrlRewrite。但是,這個用例應該很容易支持,我們很快就會研究它!

現在,爲了獲得預期的行爲,可以創建一個像這樣的自定義規則。注意此時我無法測試代碼,但總體思路應該是正確的。

 app.UseRewriter(new RewriteOptions().Add(ctx => 
     { 
      // checking if the hostName has www. at the beginning 
      var req = ctx.HttpContext.Request; 
      var hostName = req.Host; 
      if (hostName.ToString().StartsWith("www.")) 
      { 
       // Strip off www. 
       var newHostName = hostName.ToString().Substring(4); 

       // Creating new url 
       var newUrl = new StringBuilder() 
             .Append(req.Scheme) 
             .Append(newHostName) 
             .Append(req.PathBase) 
             .Append(req.Path) 
             .Append(req.QueryString) 
             .ToString(); 

       // Modify Http Response 
       var response = ctx.HttpContext.Response; 
       response.Headers[HeaderNames.Location] = newUrl; 
       response.StatusCode = 301; 
       ctx.Result = RuleResult.EndResponse; 
      } 
     })); 
+0

https:// github。 com/aspnet/BasicMiddleware/issues/196 –

+0

我仍然需要添加'://'。 'var newUrl = $「{request.Scheme}:// {domain} {request.PathBase} {request.Path} {request.QueryString}」;' – amoss