如何删除www。 ASP.NET MVC中的前缀

时间:2011-02-03 03:49:03

标签: asp.net .net-4.0 url-rewriting asp.net-mvc-3

如何删除www。来自传入请求?我是否需要设置301重定向或只是重写路径?无论哪种方式,最好的方法是什么?

谢谢!

6 个答案:

答案 0 :(得分:7)

我认为使用IIS的URL重写模块更合适。

如果您可以访问IIS的管理工具,则可以在站点设置的“IIS”部分中设置用于设置重写规则的GUI。如果您从那里选择“添加规则...”(在右栏菜单中),请选择SEO部分中的“规范域名”规则,几乎完全自动化设置规则。

如果没有,重写规则在web.config中将如下所示:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="CanonicalHostNameRule1">
                <match url="(.*)" />
                <conditions>
                    <add input="{HTTP_HOST}" pattern="^yourdomain\.com$" negate="true" />
                </conditions>
                <action type="Redirect" url="http://yourdomain.com/{R:1}" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

答案 1 :(得分:2)

您可以处理Application.BeginRequest事件并检查Request.Host是否以www开头。
如果是,请调用Response.RedirectPermanent,并传递带有请求路径和裸域的URL。

您可以通过编写

来构建新的URL
"yourdomain.com" + Request.Url.PathAndQuery

答案 2 :(得分:2)

我在这里找到了一个很好的解决方案:http://nayyeri.net/remove-quotwwwquot-from-urls-in-asp-net

public class RemoveWWWPrefixModule : IHttpModule
{
    public void Dispose() { }

    private static Regex regex = new Regex("(http|https)://www\\.", RegexOptions.IgnoreCase | RegexOptions.Compiled);

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication application = sender as HttpApplication;
        Uri url = application.Context.Request.Url;
        bool hasWWW = regex.IsMatch(url.ToString());

        if (hasWWW)
        {
            String newUrl = regex.Replace(url.ToString(),
            String.Format("{0}://", url.Scheme));
            application.Context.Response.RedirectPermanent(newUrl);
        }
    }
}

答案 3 :(得分:2)

您可以在web.config文件中使用以下重写规则。

此重写规则将删除WWW并保留尾随网址和启动协议。

    <rewrite>
       <rules>
          <clear/>
             <rule name="Canonical host name" enabled="true">
                <match url="(.*)"/>
                <conditions trackAllCaptures="true">
                    <add input="{HTTP_HOST}" negate="false" pattern="^www\.(.+)$"/>
                    <add input="{CACHE_URL}" pattern="^(.+)://" />
                </conditions>
                <action type="Redirect" url="{C:2}://{C:1}{REQUEST_URI}" appendQueryString="false" redirectType="Permanent"/>
             </rule>
       </rules>
    </rewrite>

答案 4 :(得分:0)

这是更通用的配置,因为您可以在根目录的URL重写中编写一次(不是特定于某个应用程序池),它将自动应用于所有IIS网站,而不依赖于您的域名。

IIS Remove WWW

答案 5 :(得分:0)

更简单的解决方案是创建动作过滤器并用它来装饰你的动作。

public class RemovePrefix : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
                var url = filterContext.HttpContext.Request.Url.ToString().Replace("http://www.", "http://");
                filterContext.Result = new RedirectResult(url);

    }
}