ASP.Net Coreアプリケーションの起動時に、次のことがあります。
RewriteOptions rewriteOptions = new RewriteOptions();
rewriteOptions.AddRedirectToHttps();
applicationBuilder.UseRewriter(rewriteOptions);
本番環境では、すべての非WWWをWWWURLにリダイレクトする必要があります
例えば:
domain.com/about > www.domain.com/about
RewriteMiddlewareを使用してこれを行うにはどうすればよいですか?
これは、AddRedirectとRegexを使用して実行できると思います。
しかし、それを行う方法がわからない...
再利用可能な代替手段は、カスタムの書き換えルールと対応する拡張メソッドを作成して、ルールを書き換えオプションに追加することです。これは、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);
リライトミドルウェアの将来のバージョンには、ルールと対応する拡張メソッドが含まれる予定です。 このプルリクエスト を参照してください
私は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")
完了!
正規表現だけを使用して、
^(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)
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番目のキャプチャグループです。
必須でない限り、正規表現を使用する代わりに、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
試してみる正規表現は次のとおりです。
(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."));
}
正規表現は必要ありません。単純な置換で機能します。
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."));
}