这是我与 ASP.NET Core 1.1 Url Rewriting 中间件一起使用以从 www 重定向的核心。到非 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" }
);
});
}
最佳答案
问题是 .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;
}
}));
关于url-rewriting - ASP.NET Core 1.1 Url 重写 - www 到非 www,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41205435/