如何将带有“www”的URL重定向到不带“www”的URL,或者反之?

15

我正在使用ASP.NET 2.0 C#。我想将所有带有"www"的Web应用程序请求重定向到没有"www"的请求。

www.example.com 重定向到 example.com

或者

example.com 重定向到 www.example.com

Stackoverflow.com已经实现了这一点,我知道在PHP(.htaccess)文件中有一个预制机制。但如何在ASP.NET中实现呢?

谢谢


1
如果您想在其他地方查找它,这被称为“规范名称”。 - Diodeus - James MacFarlane
3
重要提醒:如果您在使用时没有使用www(或其他子域),则所有cookie都将提交到每个子域,因而您将无法拥有无cookie的子域来提供静态内容,从而减少浏览器和服务器之间发送的数据量。这可能是您以后会后悔的事情。http://twitter.com/codinghorror/statuses/1637428313 - Sam Hasler
1
@Diodeus - 我们真的需要那个标签吗? - theycallmemorty
1
更正:.htaccess与PHP完全无关,它是Apache服务器的一个功能,无论您在Apache上使用哪种语言都可以使用。 - DisgruntledGoat
可能是在.NET MVC中将www链接路由到非www链接的重复问题。 - BrunoLM
8个回答

27

关于这个问题,Stackoverflow有一篇博客文章。

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

引用Jeff的话:

以下是IIS7规则,用于从所有传入的URL中删除WWW前缀。将此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、<meta>标签等来询问一个过程的原因。 - djmzfKnm
2
也许我漏掉了什么,但是你接受的答案需要你修改web.config文件。我的答案同样需要你修改web.config文件。 - shsteimer

6

在过去,当我不能修改IIS设置时,我通常采用以下解决方案。

在HTTPModule中(可能是最干净的方式),或者在global.asax.cs的Application_BeginRequest中,或者在一些BasePage类型的事件中,比如OnInit,我会对所请求的URL进行检查,使用已知的字符串来确定我想使用的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>

这种方法对我们非常有效。

5

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

这是我的IIS7 URL Rewrite模块规则(此处的操作类型实际上是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>


2
为了回答这个问题,我们首先要回忆一下WWW的定义:
万维网: n.缩写 WWW
  • 使用HTTP协议的所有Internet服务器上驻留的文档集合,用户可以通过简单的点-and-click系统访问。
  • n:通过超文本传输协议提供文本、图形、声音和动画资源的互联网站点集合。 默认情况下,所有流行的Web浏览器都假定使用HTTP协议。在这样做时,软件将“http://”前缀添加到请求的URL,并自动连接到端口80上的HTTP服务器。那么为什么许多服务器要求其网站通过www子域通信呢?邮件服务器不要求您向recipient@mail.domain.com发送电子邮件。同样,Web服务器应该允许访问它们的页面,除非需要特定的子域。
简而言之,使用www子域是多余且耗时的沟通方式。没有它,互联网、媒体和社会都会更好。
使用页面顶部的链接,您可以查看最近验证的域名,以及提交域名进行实时验证。 Apache Web服务器:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

Windows Server/IIS: 没有办法。

你可以使用Code Plex上的Url Rewriter。使用相同的语法。

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

来源

(涉及IT技术)

0

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

话虽如此,您可以在PHP中以及几乎肯定的ASP中执行此操作,但您必须使任何错误域名的URL都调用执行重定向操作的ASP脚本(使用适当的API调用或直接设置标头)。这将需要服务器进行一些URL重写或类似操作,以便所有错误主机上的URL都由您的脚本处理...最好直接在服务器上进行操作 :)


0
我们在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、<meta>标签等来请求一个过程的原因。 - djmzfKnm

0
如果您正在使用IIS 7,只需导航到URL重写并添加规范域名规则。
附注:这是为了确保您从domain.com重定向到www.domain.com。

0

此版本将会:

  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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接