【问题标题】:Forwarding http://mydomain.com/ctrlr/act/val to http://WWW.mydomain.com/ctrlr/act/val转发 http://mydomain.com/ctrlr/act/val 到 http://WWW.mydomain.com/ctrlr/act/val
【发布时间】:2010-12-01 09:46:11
【问题描述】:

我有一个使用 ASP.NET MVC (V 1.0) 编写的应用程序。该应用程序在 IIS7 上运行,DNS 由 GoDaddy 提供。

我想将来自 http://mydomain.com/ctrlr/act/value 的任何请求转发到以下形式的 URL:http://WWW.mydomain.com/ctrlr/act/value

基本上,如果有人尝试访问http://mydomain.com,我想将 WWW 添加到主机名中

最好的方法是什么?

【问题讨论】:

  • 我认为这更像是一个 IIS 问题。您应该添加标签以引起 IISers 的注意
  • 我不会将此作为答案提交,因为这需要您更改开发堆栈。但这是我使用 Apache 为我的博客解决同样问题的方法:pastie.org/630298。唯一的区别是我在前面添加博客而不是 www。另请注意,在我的情况下,相同的服务器会回答两个域名(不知道是否是您的情况)。
  • @xraminx 改变主意在下面重新回答?

标签: asp.net-mvc iis url-rewriting


【解决方案1】:

我想你会从这个question中找到适合的答案

我同意你强制使用 www 的想法,就好像 SO 决定 use it 我相信他们在调整 cookie 的性能并且不得不使用 sstatic.net 而不是 images.stackoverflow.com 时感到遗憾。

在这里为您节省重定向是您需要做的事情的要点。

这是 IIS7 规则,用于将 WWW 前缀添加到所有传入的 URL。将此 XML 片段剪切并粘贴到您的 web.config 文件中

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


<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>

【讨论】:

  • 简单直接的解决方案。谢谢@dove
  • 我认为ignoreCase 的正则表达式模式是.* 是没有原因的。
【解决方案2】:

您可以使用 Code Plex 中的Url Rewriter。您可以通过执行以下操作将所有内容强制到 www.domain.com:

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

或者如果您想让它更适合您的域

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

这还支持 mod_rewrite 提供的一大堆其他重写器功能。

【讨论】:

    【解决方案3】:

    刚刚在单独的帖子上回答了这个问题,但我会重新发布

    我选择在应用程序级别执行此操作,而不是 IIS。这是我为此编写的一个快速操作过滤器。只需在项目中的某处添加类,然后您可以将 [RequiresWwww] 添加到单个操作或整个控制器。

    public class RequiresWww : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                HttpRequestBase req = filterContext.HttpContext.Request;
                HttpResponseBase res = filterContext.HttpContext.Response;
    
                //IsLocal and IsLoopback i'm not too sure on the differences here, but I have both to eliminate local dev conditions. 
                if (!req.IsLocal && !req.Url.Host.StartsWith("www") && !req.Url.IsLoopback)
                {
                    var builder = new UriBuilder(req.Url)
                    {
                        Host = "www." + req.Url.Host
                    };
    
                    res.Redirect(builder.Uri.ToString());
    
                }
    
                base.OnActionExecuting(filterContext);
            }
        }
    

    然后

    [RequiresWwww]
    public ActionResult AGreatAction()
    {
    ...
    }
    

    [RequiresWwww]
    public class HomeController : BaseAppController 
    {
    ..
    ..
    }
    

    希望对某人有所帮助。干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2018-04-07
      • 1970-01-01
      相关资源
      最近更新 更多