2016-12-18 5 views
4

ここでは、ASP.NET Core 1.1 URLで使用するコアをミドルウェアを書き換えてwwwからリダイレクトします。非WWWへ: ASP.NET Core 1.1 URL書き換え - 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

'://'を追加する必要がありました。 {ドメイン名} {request.PathBase} {リクエスト。パス} {リクエスト。クエリ文字列} "; – amoss

関連する問題