我确定这是一个简单的问题,但我注意到,当我在一个网站上托管(在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中的一个设置。
答案 0 :(得分:5)
导致此行为的原因有两个。
我想你是在共享主机中托管多个网站。
要解决此问题,您需要进入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
}