web-dev-qa-db-ja.com

Asp.Netコアミドルウェアを使用して非WWWをWWWにリダイレクトする

ASP.Net Coreアプリケーションの起動時に、次のことがあります。

RewriteOptions rewriteOptions = new RewriteOptions(); 

rewriteOptions.AddRedirectToHttps();

applicationBuilder.UseRewriter(rewriteOptions);

本番環境では、すべての非WWWをWWWURLにリダイレクトする必要があります

例えば:

domain.com/about > www.domain.com/about

RewriteMiddlewareを使用してこれを行うにはどうすればよいですか?

これは、AddRedirectとRegexを使用して実行できると思います。

Github-ASP.NETコアリダイレクトドキュメント

しかし、それを行う方法がわからない...

15
Miguel Moura

再利用可能な代替手段は、カスタムの書き換えルールと対応する拡張メソッドを作成して、ルールを書き換えオプションに追加することです。これは、AddRedirectToHttpsの動作と非常によく似ています。

カスタムルール:

public class RedirectToWwwRule : IRule
{
    public virtual void ApplyRule(RewriteContext context)
    {
        var req = context.HttpContext.Request;
        if (req.Host.Host.Equals("localhost", StringComparison.OrdinalIgnoreCase))
        {
            context.Result = RuleResult.ContinueRules;
            return;
        }

        if (req.Host.Value.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
        {
            context.Result = RuleResult.ContinueRules;
            return;
        }

        var wwwHost = new HostString($"www.{req.Host.Value}");
        var newUrl = UriHelper.BuildAbsolute(req.Scheme, wwwHost, req.PathBase, req.Path, req.QueryString);
        var response = context.HttpContext.Response;
        response.StatusCode = 301;
        response.Headers[HeaderNames.Location] = newUrl;
        context.Result = RuleResult.EndResponse;
    }
}

拡張方法:

public static class RewriteOptionsExtensions
{
    public static RewriteOptions AddRedirectToWww(this RewriteOptions options)
    {
        options.Rules.Add(new RedirectToWwwRule());
        return options;
    }
}

使用法:

var options = new RewriteOptions();
options.AddRedirectToWww();
options.AddRedirectToHttps();
app.UseRewriter(options);

リライトミドルウェアの将来のバージョンには、ルールと対応する拡張メソッドが含まれる予定です。 このプルリクエスト を参照してください

13
hankor

私はApacheユーザーであり、幸いASP.NETCoreのURLRewriting Middlewareは、mod_rewriteルールをその場で実行するための AddApacheModRewrite というメソッドを提供します。

1-名前に関係なく.txtファイルを作成し、次の2行を入力します。

RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_Host}/$1 [R=301,L]

2-それからそれをこのように呼びます:

AddApacheModRewrite(env.ContentRootFileProvider, "Rules.txt")

完了!

3
revo

正規表現だけを使用して、

^(https?://)?((?!www\.)(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))を検索します

$1www.$2を置き換えます

拡張

 ^                             # BOS
 (                             # (1 start), optional http(s)
      https?  ://
 )?                            # (1 end)
 (                             # (2 start), domains without www prefix
      (?! www\. )
      (?:
           (?: [a-z\u00a1-\uffff0-9]+ -? )*
           [a-z\u00a1-\uffff0-9]+ 
      )
      (?:
           \.
           (?: [a-z\u00a1-\uffff0-9]+ -? )*
           [a-z\u00a1-\uffff0-9]+ 
      )*
      (?:
           \.
           (?: [a-z\u00a1-\uffff]{2,} )
      )
 )                             # (2 end)
3
user557597

AddRedirectメソッドが何をするのか、そして実際に正規表現を受け入れるのかどうかは不明です。

しかし、「www」のないURLに「www」を挿入するには?
次の文字列で試すことができます。

string pattern = @"^(https?://)(?!www[.])(.*)$";
string replacement = "$1www.$2";

//Regex rgx = new Regex(pattern);
//string redirectUrl = rgx.Replace(url, replacement);

ネガティブな先読みのため(?!www[.])プロトコルの後、 http://www.what.ever のような文字列を無視します

$ 1と$ 2は、最初と2番目のキャプチャグループです。

2
LukStorms

必須でない限り、正規表現を使用する代わりに、Uriクラスを使用してURLを再構築できると思います。

var uri = new Uri("http://example.com/test/page.html?query=new&sortOrder=ASC");
var returnUri = $"{uri.Scheme}://www.{uri.Authority}
{string.Join(string.Empty, uri.Segments)}{uri.Query}";

そして結果は次のようになります

Output: http://www.example.com/test/page.html?query=new&sortOrder=ASC
1
Gururaj

試してみる正規表現は次のとおりです。

(http)(s)?(:\/\/)[^www.][A-z0-9]+(.com|.gov|.org)

次のようなURLを選択します。

  • http://example.com
  • https://example.com
  • http://example.gov
  • https://example.gov
  • http://example.org
  • https://example.org

しかし、好きではありません:

  • http://www.example.com
  • https://www.example.com

明示的な拡張子を使用することを好みます(例:.com.gov、または.org)可能であれば、ただし、ユースケースに有益な場合は、次のようなものを使用することもできます。

(http)(s)?(:\/\/)[^www.][A-z0-9]+(.*){3}

次に、次のようなもので置き換えにアプローチします。

Regex r = new Regex(@"(http)(s)?(:\/\/)[^www.][A-z0-9]+(.*){3}");
string test = @"http://example.org";
if (r.IsMatch(test))
{
    Console.WriteLine(test.Replace("https://", "https://www."));
    Console.WriteLine(test.Replace("http://", "http://www."));
}
0
Austin Drenski

正規表現は必要ありません。単純な置換で機能します。

var temp = new string[] {"http://google.com", "http://www.google.com", "http://gmail.com", "https://www.gmail.com", "https://example.com"};

var urlWithoutWWW = temp.Where(d => 
                         d.IndexOf("http://www") == -1 && d.IndexOf("https://www") == -1);

foreach (var newurl in urlWithoutWWW)
{
     Console.WriteLine(newurl.Replace("://", "://www."));
}
0
prospector