防止 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 的前面的主要内容,如果未能解决你的问题,请参考以下文章

PHP 怎么防止GET方式提交重复数据?

如何防止网站被*** 防止网站数据被***篡改

MyBatis怎么防止SQL注入

如何彻底防止SQL注入?

怎么防止网站被***和防止服务器被黑

在winform当中提交数据,如何防止重复提交?