2016-12-18 5 views
4

다음은 ASP.NET Core 1.1 URL에서 사용하는 코어입니다. www에서 리디렉션하기 위해 미들웨어를 다시 작성합니다. www가 아닌 ​​경우 :ASP.NET 코어 1.1 URL 재 작성 - www가 아닌 ​​URL

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