iis asp.net :如何将非www重定向到www,反之亦然

sh7euo9m  于 2022-11-12  发布在  .NET
关注(0)|答案(9)|浏览(179)

我想将所有www流量重定向到非www流量
我已将此复制到我的web.config

<system.webServer> / <rewrite> / <rules>

<rule name="Remove WWW prefix" >
<match url="(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.example\.com" />
</conditions>
<action type="Redirect" url="http://example.com/{R:1}"
    redirectType="Permanent" />
</rule>

根据此帖子
如何将带有“www”的URL重定向到不带“www”的URL,或反之亦然?
但我收到了一个500内部服务器错误。

imzjd6km

imzjd6km1#

您可以考虑一种不同的方法:

protected void Application_BeginRequest (object sender, EventArgs e)
{
   if (!Request.Url.Host.StartsWith ("www") && !Request.Url.IsLoopback)
   {
      UriBuilder builder = new UriBuilder (Request.Url);
      builder.Host = "www." + Request.Url.Host;
      Response.Redirect (builder.ToString (), true);
   }
}

但是,这将执行302重定向,因此建议进行一点调整:

protected void Application_BeginRequest (object sender, EventArgs e)
{
   if (!Request.Url.Host.StartsWith ("www") && !Request.Url.IsLoopback)
   {
      UriBuilder builder = new UriBuilder (Request.Url);
      builder.Host = "www." + Request.Url.Host;
      Response.StatusCode = 301;
      Response.AddHeader ("Location", builder.ToString ());
      Response.End ();
   }
}

此操作将返回301 Moved Permanently(永久移动)。

avkwfej4

avkwfej42#

如果你直接复制了它,那么你的web.config中有不正确的标记
您需要

<system.webServer>
    <rewrite>
      <rules>
        <rule name="Remove WWW prefix" >
        <match url="(.*)" ignoreCase="true" />
        <conditions>
        <add input="{HTTP_HOST}" pattern="^www\.example\.com" />
        </conditions>
        <action type="Redirect" url="http://example.com/{R:1}"
            redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
<system.webServer>

这行字写着

<system.webServer> / <rewrite> / <rules>

声明您需要将config放在web.Config中的该位置。<system.webServer>web.Config文件的configSection之一。
请确保首先为IIS7安装了URL Rewrite module
上面的页面讨论了将HTTP重定向到HTTPS,但是这个概念仍然适用于WWW到非WWW
此外,这里还有一些detailed information,说明这一切是如何结合在一起的。

bttbmeg0

bttbmeg03#


**For a www to a non www Thanks @developerart**

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Url.Host.StartsWith("www") && !Request.Url.IsLoopback)
        {
            UriBuilder builder = new UriBuilder(Request.Url);
            builder.Host = Request.Url.Host.Replace("www.","");
            Response.StatusCode = 301;
            Response.AddHeader("Location", builder.ToString());
            Response.End();
        }
    }
mtb9vblg

mtb9vblg4#

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if (!this.Request.Url.Host.StartsWith("www") && !this.Request.Url.IsLoopback)
    {
        var url = new UriBuilder(this.Request.Url);
        url.Host = "www." + this.Request.Url.Host;
        this.Response.RedirectPermanent(url.ToString(), endResponse: true);
    }
}
7vhp5slm

7vhp5slm5#

您可以使用https和www重定向。(您需要更改“示例”)

<system.webServer>
  <!-- For force ssl and www -->
  <rewrite>
    <rules>
      <!-- For force ssl -->
      <rule name="http to https" stopProcessing="true">
        <match url="(.*)" />
        <conditions>
          <add input="{HTTPS}" pattern="^OFF$" />
        </conditions>
        <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
      </rule>
      <!-- For force ssl -->
      <!-- For force www -->
      <rule name="redirect to www" stopProcessing="true">
        <match url="(.*)" />
        <conditions>
          <add input="{HTTP_HOST}"  pattern="^example\.com$" />
        </conditions>
        <action type="Redirect" url="https://www.{HTTP_HOST}/{R:0}" redirectType="Permanent" />
      </rule>
      <!-- For force www -->
    </rules>
  </rewrite>
  <!-- For force ssl and www -->
</system.webServer>
avwztpqn

avwztpqn6#

基于用户151323的答案,以下是Azure用户的完整答案,这些用户还希望阻止用户从azurewebsites.net子域访问站点(这将进入主类中的Global.asax(对于MVC用户为MvcApplication)):

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Url.Host.StartsWith("YourSite.azurewebsites") && !Request.Url.IsLoopback)
        {
            Response.StatusCode = 301;
            Response.AddHeader("Location", "www.example.com");
            Response.End();

            return;
        }

        if (!Request.Url.Host.StartsWith("www") && !Request.Url.IsLoopback)
        {
            UriBuilder builder = new UriBuilder(Request.Url);
            builder.Host = "www." + Request.Url.Host;
            Response.StatusCode = 301;
            Response.AddHeader("Location", builder.ToString());
            Response.End();
        }
    }
tsm1rwdh

tsm1rwdh7#

我知道这个主题很古老,似乎已经被淘汰了。但是,在每个人的global.asax建议中加上一个检查您是否在本地工作的选项可能会很有用。这样,在使用IIS Express进行开发的过程中,您的站点就不会尝试重定向到'www'子域。
大致如下:

protected void Application_BeginRequest(
        object sender,
        EventArgs e)
    {
        if (!Request.IsLocal)
        {
            // Do your check for naked domain here and do permanent redirect
        }
    }
gjmwrych

gjmwrych8#

IIS可以自动为您执行此操作:

Select site > URL rewrite > Add rule(s) > Canonical domain name

选择主域,即完成。
(If您尚未安装URL重写模块,请安装该模块:(第10页)

mqkwyuun

mqkwyuun9#

通过编写规则,您可以在服务器级别实现将非www重定向到www,也可以在IIS中实现。
此规则将起作用,但请注意,只有在IIS服务器上安装了URL重写时,此规则才起作用。如果IIS服务器上未安装URL重写,则此规则将不起作用。
为了在您的服务器上安装URL重写,然后到这个官方网站link并下载扩展到您的服务器上并安装它。之后,重新启动IIS服务器,它就会工作。
网址重写扩展官方网站链接:https://www.iis.net/downloads/microsoft/url-rewrite

<rewrite>
            <rules>
                <rule name="Redirect example.com to http://www.example.com HTTP" patternSyntax="ECMAScript" stopProcessing="true">
                    <match url=".*"></match>
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^example.com$"></add>
                        <add input="{HTTPS}" pattern="off"></add>
                    </conditions>
                    <action type="Redirect" url="http://www.example.com/{R:0}" redirectType="Permanent" appendQueryString="true"></action>
                </rule>
            </rules>
        </rewrite>

相关问题