我正熟悉ASP.Net-MVC,我试图完成我过去用webforms和其他功能完成的一些常见任务。关于我需要做的最常见的任务是创建SEO友好的URL,这在过去意味着做一些url重写以在目录路径中构建查询字符串。
例如: www.somesite.com/productid/1234/widget
而不是: www.somesite.com?productid=1234&name=widget
我在ASP.Net-MVC中使用什么方法来完成此任务?
我一直在四处寻找,而我所发现的就是这个,要么我不理解,要么没有真正回答我的问题:
答案 0 :(得分:10)
MVC代表“模型视图控制器”,虽然这些概念不是您所要求的,但您通常可以像上面看到的那样轻松连接网址
因此,例如默认情况下,URL看起来像以下
http://www.somesite.com/controller/view/
其中controller指的是项目中的控制器类,而view指的是控制器中的页面/方法组合。因此,例如,您可以编写视图以接受输入,并且看起来类似于以下
http://www.somesite.com/widget/productid/1234/
现在对于 SEO Friendly 网址来说,这只是无用的糖。您创建控制器,以便在URL的末尾添加无害的cruft。
例如,您会注意到以下三种方法可以产生相同的结果:
How do I create SEO-Friendly urls in ASP.Net-MVC
How do I create SEO-Friendly urls in ASP.Net-MVC
How do I create SEO-Friendly urls in ASP.Net-MVC
Stack Overflow已经创建了他们的路由值,使得问题ID之后的位不是真正必需的。
为什么要在那里?增加Google PageRank。谷歌PageRank依赖于许多东西,其总和是秘密的,但人们注意到的一件事是,在所有其他条件相同的情况下,描述性文本URL的排名更高。这就是Stack Overflow在问题编号后使用该文本的原因。
答案 1 :(得分:6)
在Global.asax中创建一个新路由来处理:
routes.MapRoute(
"productId", // Route name
"productId/{id}/{name}", // URL with parameters
new { controller = "Home", action = "productId", id = 1234, name = widget } // Parameter defaults
);
Asp.Net MVC内置了路由,因此不需要Url Rewriter。
答案 2 :(得分:3)
在实现包含名称的路由时要小心,您需要验证进入的名称是否正确,或者您可以通过让多个URI共享相同的内容来最终损害页面上的SEO排名,或者设置一个正确的规范或让您的控制器在访问“错误的”URI时发出301。
我对后一种解决方案的快速写作可以在以下网址找到:
http://mynameiscoffey.com/2010/12/19/seo-friendly-urls-in-asp-net-mvc/
关于规范的一些信息:
http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html
答案 3 :(得分:2)
我认为你所追求的是MVC路由 看看这些
答案 4 :(得分:1)
处理旧网址也很重要。我有一个旧网址和新网址的数据库,我使用以下代码重定向;
public class AspxCatchHandler : IHttpHandler, IRequiresSessionState
{
#region IHttpHandler Members
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
if (context.Request.Url.AbsolutePath.Contains("aspx") && !context.Request.Url.AbsolutePath.ToLower().Contains("default.aspx"))
{
string strurl = context.Request.Url.PathAndQuery.ToString();
string chrAction = "";
string chrDest = "";
try
{
DataTable dtRedirect = SqlFactory.Execute(
ConfigurationManager.ConnectionStrings["emptum"].ConnectionString,
"spGetRedirectAction",
new SqlParameter[] {
new SqlParameter("@chrURL", strurl)
},
true);
chrAction = dtRedirect.Rows[0]["chrAction"].ToString();
chrDest = dtRedirect.Rows[0]["chrDest"].ToString();
chrDest = context.Request.Url.Host.ToString() + "/" + chrDest;
chrDest = "http://" + chrDest;
if (string.IsNullOrEmpty(strurl))
context.Response.Redirect("~/");
}
catch
{
chrDest = "/";// context.Request.Url.Host.ToString();
}
context.Response.Clear();
context.Response.Status = "301 Moved Permanently";
context.Response.AddHeader("Location", chrDest);
context.Response.End();
}
else
{
string originalPath = context.Request.Path;
HttpContext.Current.RewritePath("/", false);
IHttpHandler httpHandler = new MvcHttpHandler();
httpHandler.ProcessRequest(HttpContext.Current);
HttpContext.Current.RewritePath(originalPath, false);
}
}
#endregion
}
希望这很有用
答案 5 :(得分:0)
domain.com/product/{id}/{slug}
它有一些好处:
代码将类似于@Martin
routes.MapRoute(
name: "Cafes",
url: "cafe/{id}/{FriendlyUrl}",// how send array in metod get
defaults: new { controller = "cafe", action = "index", id = UrlParameter.Optional, FriendlyUrl = UrlParameter.Optional }//, id = UrlParameter.Optional
);
在动作控制器中,您应该使用收到的参数检查产品的数据库信息。如果它们不相同,请使用状态301重定向以更正url。 重定向代码:
return RedirectToActionPermanent("index", new
{
id = CafeParent.CafeID,
FriendlyUrl = CafeParent.CafeSlug.Trim()
});
RedirectToAction永久重定向,状态为301。执行此操作时,搜索引擎会发现此网址已更改为您重定向的网址。