防止 AddRedirectToWwwPermanent() 在 ASP.NET Core 2.1 中将“www”添加到 *.azurewebsites.net 的前面
Posted
技术标签:
【中文标题】防止 AddRedirectToWwwPermanent() 在 ASP.NET Core 2.1 中将“www”添加到 *.azurewebsites.net 的前面【英文标题】:Prevent AddRedirectToWwwPermanent() from adding "www" to the front of *.azurewebsites.net in ASP.NET Core 2.1 【发布时间】:2019-03-07 23:59:58 【问题描述】:当我将我的网站部署为 Azure Web 应用程序时,我的 AddRedirectToWwwPermanent()
重写规则是添加“www”。到默认 azure URL 的前面,例如www.myproject.azurewebsites.net
。在子域中使用“www”会导致页面无法加载。
有没有办法跳过专门针对*.azurewebsites.net
URL 的AddRedirectToWwwPermanent()
重写规则?
我目前在Startup.cs
中使用重写器:
app.UseRewriter(new RewriteOptions()
.AddRedirectToWwwPermanent()
);
或者,有没有办法将*.azurewebsites.net
URL 重定向到我自己的自定义域?我尝试了以下方法,但它不起作用:
app.UseRewriter(new RewriteOptions()
.AddRedirect(@"myproject.azurewebsites.net", @"www.example.com", StatusCodes.Status301MovedPermanently)
.AddRedirectToWwwPermanent()
);
更新,也试过了:
app.UseRewriter(new RewriteOptions()
.AddRedirect(@"https://myproject.azurewebsites.net", @"https://www.example.com", StatusCodes.Status301MovedPermanently)
.AddRedirectToWwwPermanent()
);
【问题讨论】:
尝试将http://
或https://
添加到您的网址
刚刚试了,没啥影响。 AddRedirect() 是否考虑 URL 的域名部分?我见过的所有使用它的示例都只是处理重定向 URL 的路径部分。
您在 Azure 门户中设置自定义域。你需要一个 CNAME DNS 记录来将你的域指向 Azure 域。
即使在 Azure 门户中设置了自定义域,人们仍然可以访问默认的 *.azurewebsites.net
域。还是我在 Azure 门户设置中遗漏了什么?
【参考方案1】:
这是我的解决方案,适用于 ASP.NET Core 2.1
。但是,我不知道这是否是最有效的重定向方式,所以我愿意接受更好的建议。
由于我无法让内置的 AddRedirect()
规则工作(我仍然认为我可能只是使用错误),我创建了一个自定义重写规则来执行重定向。
这是我的RedirectAzureWebsitesRule
,它将*.azurewebsites.net
重定向到自定义域:
public class RedirectAzureWebsitesRule : IRule
public int StatusCode get; = (int)HttpStatusCode.MovedPermanently;
public void ApplyRule(RewriteContext context)
HttpRequest request = context.HttpContext.Request;
HostString host = context.HttpContext.Request.Host;
if (host.HasValue && host.Value == "my-project.azurewebsites.net")
HttpResponse response = context.HttpContext.Response;
response.StatusCode = StatusCode;
response.Headers[HeaderNames.Location] = request.Scheme + "://" + "www.example.com" + request.PathBase + request.Path + request.QueryString;
context.Result = RuleResult.EndResponse;
else
context.Result = RuleResult.ContinueRules;
然后在Startup.cs
,我在AddRedirectToWwwPermanent()
之前调用了新规则:
app.UseRewriter(new RewriteOptions()
.Add(new RedirectAzureWebsitesRule())
.AddRedirectToWwwPermanent()
);
【讨论】:
这是正确答案。堆栈溢出,停止对问题和答案投反对票 工作谢谢。当我们这样做时,还要强制 https: .AddRedirectToHttpsPermanent() 并删除尾部斜杠: .AddRedirect("(.*)/$", "$1", StatusCodes.Status301MovedPermanently) 需要注意的是,这仅适用于ASP.NET Core 2.1
,从ASP.NET Core 3.0
开始,他们为AddRedirectToWwwPermanent
添加了一个重载来处理这种情况。【参考方案2】:
就像 Wellspring 的答案略有不同。如果您想让azurewebsites.net
域继续运行,您可以执行以下操作:
public class RedirectAzureWebsitesRule : IRule
public void ApplyRule(RewriteContext context)
HttpRequest request = context.HttpContext.Request;
HostString host = context.HttpContext.Request.Host;
if (host.HasValue && host.Value.ToLower().Contains(".azurewebsites.net"))
//if we are viewing on azure's domain - skip the www redirect
context.Result = RuleResult.SkipRemainingRules;
else
context.Result = RuleResult.ContinueRules;
这将确保您可以在两个域上运行(如果需要):
app.UseRewriter(new RewriteOptions()
.Add(new RedirectAzureWebsitesRule())
.AddRedirectToWwwPermanent()
);
【讨论】:
【参考方案3】:您可以向您的网站的web.config
文件添加重定向规则。您可以通过将以下重写规则添加到您的wwwroot
文件夹中的web.config
文件来做到这一点。如果您没有web.config
文件,那么您可以创建一个并将下面的文本粘贴到其中,只需更改主机名以匹配您网站的主机名:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect rquests to default azure websites domain" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="HTTP_HOST" pattern="^yoursite\.azurewebsites\.net$" />
</conditions>
<action type="Redirect" url="http://www.example.com/R:0" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
更多详情可以参考这个article。
您可以通过将现有的自定义 DNS 名称映射到 Azure Web 应用来实现这一点,这里是 article。
【讨论】:
我在 wwwroot 文件夹中创建了web.config
文件(更改了主机名)并将其发布到 Azure,但似乎没有什么不同。你确定这适用于ASP.NET Core 2.1
?【参考方案4】:
这应该可行:
.AddRedirect(@"^https?://(.+)\.azurewebsites.net(.*)$", @"https://$1.com$2", StatusCodes.Status301MovedPermanently)
【讨论】:
【参考方案5】:你需要添加这个:
.AddRedirect("^your-site.azurewebsites.net$", "https://www.Your-Site.com/R:0", StatusCodes.Status301MovedPermanently)
【讨论】:
我认为这行不通。但如果我们能做类似的事情就好了。所以如果有人可以确认请,谢谢。以上是关于防止 AddRedirectToWwwPermanent() 在 ASP.NET Core 2.1 中将“www”添加到 *.azurewebsites.net 的前面的主要内容,如果未能解决你的问题,请参考以下文章