【问题标题】:How to redirect with "www" URL's to without "www" URL's or vice-versa?如何使用“www” URL 重定向到没有“www” URL,反之亦然?
【发布时间】:2010-10-06 00:40:08
【问题描述】:

我正在使用 ASP.NET 2.0 C#。我想将带有“www”的网络应用程序的所有请求重定向到不带“www”的网络应用程序

www.example.com 到 example.com

或者

example.com 到 www.example.com

Stackoverflow.com 已经在这样做了,我知道 PHP (.htaccess) 文件中有一个预制机制。但是在asp.net中怎么做呢?

谢谢

【问题讨论】:

  • 如果您想在别处查找,这称为“规范名称”。
  • 请务必注意,如果您不使用 www(或其他子域),那么所有 cookie 都将提交到每个子域,并且您将无法拥有无 cookie用于提供静态内容的子域,从而减少了浏览器和服务器之间来回发送的数据量。你以后可能会后悔的事情:twitter.com/codinghorror/statuses/1637428313
  • @Diodeus - 我们真的需要一个标签吗?
  • 更正:.htaccess 与 PHP 完全无关,它是一个 Apache 服务器功能,适用于您在 Apache 上使用的任何语言。

标签: c# asp.net redirect canonical-name


【解决方案1】:

有一篇关于此的 Stackoverflow 博客文章。

https://blog.stackoverflow.com/2008/06/dropping-the-www-prefix/

引用杰夫的话:

这是删除 WWW 的 IIS7 规则 所有传入 URL 的前缀。剪切和 将此 XML 片段粘贴到您的

下的 web.config 文件
<system.webServer> / <rewrite> / <rules>

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

或者,如果您更喜欢使用 www 前缀,你也可以这样做:

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

【讨论】:

  • 实际上问题是我在godaddy的共享主机服务器上,我无权修改IIS设置。 :( 这就是为什么我通过 ASP.NET、 标记等询问程序的原因。
  • 也许我遗漏了一些东西,但您接受的答案要求您修改 web.config。我的回答还需要你修改web.config。
【解决方案2】:

过去,当我无法修改 IIS 设置时,我采用了以下解决方案。

在 HTTPModule(可能是最干净的)或 Application_BeginRequest 中的 global.asax.cs 或某些 BasePage 类型的事件(例如 OnInit)中,我使用我希望使用的已知字符串对请求的 url 执行检查:

public class SeoUrls : IHttpModule
{
  #region IHttpModule Members

  public void Init(HttpApplication context)
  {
      context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
  }

  public void Dispose()
  {
  }

  #endregion

  private void OnPreRequestHandlerExecute(object sender, EventArgs e)
  {
    HttpContext ctx = ((HttpApplication) sender).Context;
    IHttpHandler handler = ctx.Handler;

    // Only worry about redirecting pages at this point
    // static files might be coming from a different domain
    if (handler is Page)
    {
      if (Ctx.Request.Url.Host != WebConfigurationManager.AppSettings["FullHost"])
      {
        UriBuilder uri = new UriBuilder(ctx.Request.Url);

        uri.Host = WebConfigurationManager.AppSettings["FullHost"];

        // Perform a permanent redirect - I've generally implemented this as an 
        // extension method so I can use Response.PermanentRedirect(uri)
        // but expanded here for obviousness:
        response.AddHeader("Location", uri);
        response.StatusCode = 301;
        response.StatusDescription = "Moved Permanently";
        response.End();
      }
    }
  }
}

然后在您的 web.config 中注册该类:

<httpModules>
  [...]
  <add type="[Namespace.]SeoUrls, [AssemblyName], [Version=x.x.x.x, Culture=neutral, PublicKeyToken=933d439bb833333a]" name="SeoUrls"/>
</httpModules>

这种方法对我们来说效果很好。

【讨论】:

    【解决方案3】:

    接受的答案适用于单个 URL 或仅几个 URL,但我的应用程序提供数百个域名(手动输入的 URL 太多)。

    这是我的 IIS7 URL 重写模块规则(这里的操作类型实际上是 301 重定向,而不是“重写”)。效果很好:

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

    【讨论】:

    • 当我尝试使用重定向到“www.{HTTP_HOST}/{R:1}”的规则时,什么也没有发生。如果我将“{HTTP_HOST}”更改为实际域名,它就可以工作。还有什么我需要更改的,以便规则使用“{HTTP_HOST}”起作用吗?谢谢。
    • 条件和动作写的完全一样吗?
    【解决方案4】:

    要回答这个问题,我们首先要回忆一下WWW的定义:

    万维网: n.缩写。万维网

    • 驻留在所有使用 HTTP 协议的 Internet 服务器上的完整文档集,用户可以通过简单的点击系统访问。
    • n :通过超文本传输​​协议提供文本和图形以及声音和动画资源的 Internet 站点集合。 默认情况下,所有流行的 Web 浏览器都采用 HTTP 协议。这样做时,软件会在请求的 URL 前加上“http://”,并自动连接到端口 80 上的 HTTP 服务器。为什么许多服务器要求他们的网站通过 www 子域进行通信?邮件服务器不要求您将电子邮件发送到收件人@mail.domain.com。同样,Web 服务器应允许通过主域访问其页面,除非需要特定的子域。

    简而言之,使用 www 子域是多余且耗时的通信。没有它,互联网、媒体和社会都会变得更好。

    使用页面顶部的链接,您可以查看最近验证的域以及提交域以进行实时验证。

    Apache 网络服务器:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 
    

    Windows 服务器/IIS: 没办法。

    您可以使用Url Rewriter from Code Plex。使用相同的语法。

    RewriteCond %{HTTP_HOST} !^(www).*$ [NC]
    RewriteRule ^(.*)$ http://www.%1$1 [R=301]
    

    Source

    【讨论】:

      【解决方案5】:

      这通常由您的网络服务器直接在配置中处理。正如您所提到的,.htaccess 文件为 Apache Web 服务器执行此操作——它与 PHP 无关。由于您使用的是 ASP,因此几乎可以肯定您的服务器是 IIS。我知道有一种方法可以直接使用 IIS 进行设置,但我不知道它是什么。知道您应该在谷歌上搜索与“IIS 重定向”相关的内容,而不是“ASP 重定向”,这可能有助于您进行搜索。

      也就是说,您可以在 PHP 中执行此操作,几乎可以肯定 ASP 也可以,但是您必须在错误域中访问任何 URL 调用执行重定向操作的 ASP 脚本(使用适当的 API 调用或通过直接设置标题)。这将需要在服务器方面进行一些 URL 重写或类似操作,以便错误主机上的所有 URL 都由您的脚本处理......首先直接在服务器上执行 :)

      【讨论】:

        【解决方案6】:

        我们在 IIS 6 上非常简单地做到了这一点。 我们基本上创建了第二个虚拟服务器,它上面除了自定义 404 页面 .aspx 页面之外什么都没有。 此页面捕获对 WHATEVERSERVER.com/whateverpage.aspx 的任何请求,并通过将 URL 更改为 www.whateverserver.com/whateverpage.aspx 重定向到真实服务器。

        设置起来非常简单,并且它的优点是它可以与进入其中的任何域一起使用(例如,如果您有多个域),而无需为每个域设置额外的规则。所以任何对 www.myoldserver.com/xxx 的请求也会被重定向到 www.whateverserver.com/xxx

        在 IIS 7 中,所有这些都可以通过 URL 编写组件完成,但我们更愿意在此虚拟服务器上保持重定向关闭。

        【讨论】:

        • 实际上问题是我在godaddy的共享主机服务器上,我无权修改IIS设置。 :( 这就是为什么我通过 ASP.NET、 标记等询问程序的原因。
        【解决方案7】:

        如果您使用的是 IIS 7,只需导航到 URL 重写并添加规范域名规则。

        附:确保您从 domain.com 重定向到 www.domain.com

        【讨论】:

          【解决方案8】:

          此版本将:

          1. 维护传入请求的 http/https。
          2. 在需要时支持各种主机(例如,按域区分租户的多租户应用程序)。

          <rule name="Redirect to www" stopProcessing="true">
            <match url="(.*)" />
            <conditions trackAllCaptures="true">
              <add input="{CACHE_URL}" pattern="^(.+)://" />
              <add input="{HTTP_HOST}" negate="true" pattern="^www\.(.+)$" />
            </conditions>
            <action type="Redirect" url="{C:1}://www.{HTTP_HOST}/{R:1}" />
          </rule>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-24
            • 1970-01-01
            • 2014-08-29
            • 2015-08-03
            • 1970-01-01
            • 2012-12-01
            • 2010-11-12
            相关资源
            最近更新 更多