URL或域/ AppName中的重复域

时间:2012-01-22 08:17:47

标签: asp.net-mvc-3

我确定这是一个简单的问题,但我注意到,当我在一个网站上托管(在GoDaddy上共享主机)时,URL会重复应用程序名称。

示例,我有http://makedifferences.org,如果我这样做的话很好,但如果我点击一个链接就会转到http://makedifferences.org/makedifferences/ ...

这不仅仅是这一个网站,它是我在GoDaddy上的所有网站,我认为在我的其他地方托管的网站上可能是相同的,但我现在无法检查它们。

我没有使用Web部署来部署它,因为我首先想到的是它必须做IIS。我的猜测是它必须是发布设置中的一个设置,但我玩它们并且似乎无法让它消失。

任何建议都将不胜感激。 谢谢, 盖瑞特

更新

这显然不是一个mvc的事情,因为我检查了我在dotnet-host.com上托管的网站,它没有这个问题。所以我想这是我在Godaddy的设置。

我删除了该文件夹并设置了一个虚拟文件夹,但这并没有解决问题。

我有多个站点托管通过它们和我的域名A记录是我所有站点的专用IP,然后在主机的域管理中我将域名指向该站点所在的文件夹。

我认为这是正确的方法,但我不确定。

要重申我的问题,我现在对它有了更多了解,如果我输入http://makedifferences.org/Charities/Details/3页面加载,一切都很完美。但是,如果我点击主页上的链接去那里,则网址为http://makedifferences.org/makedifferences/Charities/Details/3

谢谢,为什么我认为这是Visual Studio中的一个设置。

2 个答案:

答案 0 :(得分:5)

导致此行为的原因有两个。

  • 您的应用程序安装在共享主机的文件夹而不是根目录中。
  • 您的DNS设置将域名指向此文件夹。

我想你是在共享主机中托管多个网站。

要解决此问题,您需要进入IIS设置并将这些文件夹设置为虚拟目录.....或者为每个网站创建一个....然后在该文件夹中安装您的应用程序。 / p>

<强>更新

  

这实际上不是与GoDaddy共享托管相关的问题,而是在虚拟目录中托管ASP.NET MVC站点的问题。当您使用GoDaddy提供的共享主机时,您将通过虚拟目录获得根文件夹和无限子文件夹,每个子文件夹都可以是其自己的域。不幸的是,MVC的路由引擎生成的URL将包含附加到域名的虚拟目录名称。

     

例如,假设您有一个名为http://www.example.com的域,而您的文件夹/虚拟目录名是/ File。如果您在不进行任何修改的情况下进行MVC模板项目并将其上传到您的文件夹然后转到您的网址,一切都会好起来的。您会注意到页面右上角的“主页”和“关于”标签。当您单击“关于”选项卡时,由于它被路由到主页控制器的“关于”操作,因此您可以正确地期望该URL为www.example.com/Home/About。但是,您将看到,ActionLink方法生成的URL包含虚拟目录的名称。因此,该网址为www.example.com/File/Home/About。

要解决此问题,请将以下代码添加到 Web.config的 system.webServer元素

<rewrite>
    <rules>
        <rule name="Remove Virtual Directory">
            <match url=".*" />
            <action type="Rewrite" url="{R:0}" />
        </rule>
    </rules>
</rewrite>

寻求HERE

的解决方案

祝你好运: - )

答案 1 :(得分:1)

要在所有情况下都使用重写规则:

<rewrite>
    <rules>
        <rule name="Remove Virtual Directory">
            <match url=".*" />
            <action type="Rewrite" url="{R:0}" />
        </rule>
    </rules>
</rewrite>

以下功能:

protected void Application_BeginRequest()
        {
            #region Godaddy shared host fix - Detect VDIR in url and remove

            //verified that HTTP_X_ORIGINAL_URL keeps the original url (withoud domain) before url rewrite module,
            //that way can check if the virtual directory name is at start, and remove it.
            if (Request.ServerVariables.AllKeys.Contains("HTTP_X_ORIGINAL_URL"))
            {
                var origUrl = Request.ServerVariables["HTTP_X_ORIGINAL_URL"];
                var matchVdir = "/" + Myproj.Core.Constants.Environment.HostingVirtualDirectoryName + "/";

                if (origUrl.StartsWith(matchVdir))
                {
                    var urlFix = Request.Url.GetLeftPart(UriPartial.Authority) + "/" + origUrl.Remove(0, matchVdir.Length);
                    Response.RedirectPermanent(urlFix);
                }
            }
            #endregion
        }