بهبود SEO در ASP.NET MVC
نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۱۰/۱۵ ۱۸:۱۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
mydomain.com/Home/Index mydomain.com/home/index mydomain.com/Home/index mydomain.com/home/Index
using System.Globalization;
using System.Web;
using System.Web.Mvc;
namespace WebToolkit
{
public class ForceWww : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
modifyUrlAndRedirectPermanent(filterContext);
base.OnActionExecuting(filterContext);
}
private static void modifyUrlAndRedirectPermanent(ActionExecutingContext filterContext)
{
if (canIgnoreRequest(filterContext))
return;
var absoluteUrl = HttpUtility.UrlDecode(filterContext.RequestContext.HttpContext.Request.Url.AbsoluteUri.ToString(CultureInfo.InvariantCulture));
var absoluteUrlToLower = absoluteUrl.ToLowerInvariant();
absoluteUrlToLower = forceWwwAndLowercase(filterContext, absoluteUrlToLower);
absoluteUrlToLower = avoidTrailingSlashes(filterContext, absoluteUrlToLower);
if (!absoluteUrl.Equals(absoluteUrlToLower))
{
filterContext.Result = new RedirectResult(absoluteUrlToLower, permanent: true);
}
}
private static string avoidTrailingSlashes(ActionExecutingContext filterContext, string absoluteUrlToLower)
{
if (!isRootRequest(filterContext) && absoluteUrlToLower.EndsWith("/"))
return absoluteUrlToLower.TrimEnd(new[] { '/' });
return absoluteUrlToLower;
}
private static bool isRootRequest(ActionExecutingContext filterContext)
{
return filterContext.RequestContext.HttpContext.Request.Url.AbsolutePath == "/";
}
private static bool canIgnoreRequest(ActionExecutingContext filterContext)
{
return filterContext.IsChildAction ||
filterContext.HttpContext.Request.IsAjaxRequest() ||
filterContext.RequestContext.HttpContext.Request.Url.AbsoluteUri.Contains("?");
}
private static string forceWwwAndLowercase(ActionExecutingContext filterContext, string absoluteUrlToLower)
{
if (isLocalRequet(filterContext))
return absoluteUrlToLower;
if (absoluteUrlToLower.Contains("www"))
return absoluteUrlToLower;
return absoluteUrlToLower.Replace("http://", "http://www.")
.Replace("https://", "https://www.");
}
private static bool isLocalRequet(ActionExecutingContext filterContext)
{
return filterContext.RequestContext.HttpContext.Request.IsLocal;
}
}
}
if (absoluteUrlToLower.Contains("http://www.") || absoluteUrlToLower.Contains("https://www."))
return absoluteUrlToLower;
filterContext.Controller.ViewBag.CanonicalUrl = absoluteUrlToLower;
<link rel="canonical" href="@ViewBag.CanonicalUrl"/>
<a href="/contactus?name=وحید نصیری" rel="nofollow">ارسال پیام خصوصی</a>
public static void RegisterRoutes(RouteCollection routes)
{
...
routes.LowercaseUrls = true;
...
}<a rel="author" href="https://plus.google.com/your_g_plus_id?rel=author">G+</a>
<link rel="canonical" href="http://mysite.ir/home/index/5/صفحه-اصلی" />
<system.webServer>
<rewrite>
<rules>
<rule name="Enforce WWW" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{CACHE_URL}" pattern="^(.+)://(?!www)(.*)" />
</conditions>
<action type="Redirect" url="{C:1}://www.{C:2}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer> <system.webServer>
<rewrite>
<rules>
<rule name="SEO - Lower case" stopProcessing="false">
<match url="(.*)" ignoreCase="false" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_METHOD}" pattern="GET" />
<add input="{R:1}" pattern="[A-Z]" ignoreCase="false" />
</conditions>
<action type="Rewrite" url="_{ToLower:{R:1}}" />
</rule>
</rules>
</rewrite>
</system.webServer> <!-- SEO rules (from: http://www.seomoz.org/blog/what-every-seo-should-know-about-iis#chaining) -->
<!-- SEO | Section 1 | Whitelist -->
<rule name="Whitelist - Resources" stopProcessing="true">
<match url="^(?:css/|scripts/|images/|install/|config/|umbraco/|umbraco_client/|base/|webresource\.axd|scriptresource\.axd|__browserLink|[^/]*/arterySignalR/.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="None" />
</rule>
<!-- SEO | Section 2 | Rewrites (chaining) -->
<rule name="SEO - Remove default.aspx" stopProcessing="false">
<match url="(.*?)/?default\.aspx$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_METHOD}" pattern="GET" />
</conditions>
<action type="Rewrite" url="_{R:1}" />
</rule>
<rule name="SEO - Remove trailing slash" stopProcessing="false">
<match url="(.+)/$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_METHOD}" pattern="GET" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="_{R:1}" />
</rule>
<rule name="SEO - Lower case" stopProcessing="false">
<match url="(.*)" ignoreCase="false" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_METHOD}" pattern="GET" />
<add input="{R:1}" pattern="[A-Z]" ignoreCase="false" />
</conditions>
<action type="Rewrite" url="_{ToLower:{R:1}}" />
</rule>
<!-- SEO | Section 3 | Redirecting -->
<rule name="SEO - HTTP canonical redirect" stopProcessing="true">
<match url="^(_*)(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTP_HOST}" pattern="^www\.(.*)" />
<add input="{HTTP_METHOD}" pattern="GET" />
<add input="{SERVER_PORT}" pattern="80" />
</conditions>
<action type="Redirect" url="http://{C:1}/{R:2}" />
</rule>
<rule name="SEO - HTTPS canonical redirect" stopProcessing="true">
<match url="^(_*)(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTP_HOST}" pattern="^www\.(.*)" />
<add input="{HTTP_METHOD}" pattern="GET" />
<add input="{SERVER_PORT}" pattern="443" />
</conditions>
<action type="Redirect" url="http://{C:1}/{R:2}" />
</rule>
<rule name="SEO - Non-canonical redirect" stopProcessing="true">
<match url="^(_+)(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_METHOD}" pattern="GET" />
</conditions>
<action type="Redirect" url="{R:2}" />
</rule>
<!-- // SEO rules --> روش دوم تولید Urlهای lower caseدر پاسخ شما قسمت تبدیل آدرس به حروف کوچک
<action type="Rewrite" url="_{ToLower:{R:1}}" /> filters.Add(new ForceWww("https://www.dntips.ir/")); http://yourserver/folder/(session ID here)/
<rewrite>
<rules>
<rule name="Remove Session ID From URL" patternSyntax="ECMAScript" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{CACHE_URL}" pattern="^(.+):\/\/(.+)\/\((.*)\)\/(.+)" />
</conditions>
<action type="Redirect" url="https://www.dntips.ir/" redirectType="Permanent" />
</rule>
</rules>
</rewrite>