c# - mvc - razor reference
¿Cómo puedo evitar el contenido duplicado en ASP.NET MVC debido a las URL y los valores predeterminados que no distinguen entre mayúsculas y minúsculas? (6)
Editar : ahora necesito resolver este problema de verdad, hice un poco más de investigación y se me ocurrió una serie de cosas para reducir el contenido duplicado. Publiqué ejemplos detallados de código en mi blog: Reducción de contenido duplicado con ASP.NET MVC
Primera publicación: ve fácil si he marcado esto incorrectamente o lo he etiquetado mal: P
En el nuevo marco ASP.NET MVC de Microsoft, parece que hay dos cosas que podrían hacer que su contenido se publique en múltiples URL (algo que penalizará a Google y provocará que su PageRank se divida entre ellos):
- URL insensibles a mayúsculas y minúsculas
- URL predeterminada
Puede establecer el controlador / acción predeterminado para atender solicitudes a la raíz de su dominio. Digamos que elegimos HomeController / Index. Terminamos con las siguientes URL que ofrecen el mismo contenido:
- mydomain.com/
- midominio.com/Home/Index
Ahora, si la gente comienza a vincularse con ambos, entonces el PageRank se dividiría. Google también lo consideraría contenido duplicado y penalizaría a uno de ellos para evitar duplicados en sus resultados.
Además de esto, las URL no distinguen entre mayúsculas y minúsculas, por lo que también obtenemos el mismo contenido para estas URL:
- midominio.com/Home/Index
- midominio.com/home/index
- mydomain.com/Home/index
- mydomain.com/home/Index
- (la lista continua)
Entonces, la pregunta ... ¿Cómo evito estas sanciones? Me gustaría:
- Todas las solicitudes de redirección de la acción predeterminada (estado 301) a la misma URL
- Todas las URL son sensibles a mayúsculas y minúsculas
¿Posible?
Estaba trabajando en esto también. Obviamente, haré referencia a ScottGu en esto. Humildemente ofrezco mi solución a este problema también.
Agregue el siguiente código a global.asax :
protected void Application_BeginRequest(Object sender, EventArgs e)
{
// If upper case letters are found in the URL, redirect to lower case URL.
if (Regex.IsMatch(HttpContext.Current.Request.Url.ToString(), @"[A-Z]") == true)
{
string LowercaseURL = HttpContext.Current.Request.Url.ToString().ToLower();
Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location",LowercaseURL);
Response.End();
}
}
Una gran pregunta!
Además de publicar aquí, envié un correo electrónico a ScottGu para ver si tenía una buena respuesta. Dio una muestra para agregar restricciones a las rutas, por lo que solo podía responder a las URL en minúsculas:
public class LowercaseConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route,
string parameterName, RouteValueDictionary values,
RouteDirection routeDirection)
{
string value = (string)values[parameterName];
return Equals(value, value.ToLower());
}
Y en el método de rutas de registro:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "home", action = "index", id = "" },
new { controller = new LowercaseConstraint(), action = new LowercaseConstraint() }
);
}
Es un comienzo, pero quiero poder cambiar la generación de enlaces de métodos como Html.ActionLink y RedirectToAction para que coincidan.
Creo que hay una mejor respuesta para esto. Si pones un enlace canónico en el encabezado de tu página como:
<link rel="canonical" href="http://mydomain.com/Home/Index"/>
Luego, Google solo muestra la página canónica en sus resultados y, lo que es más importante, toda la bondad de Google va a esa página sin penalización.
realmente no sé cómo te sentirás después de 8 años, pero ahora ASP MVC 5 admite enrutamiento de atributos para rutas fáciles de recordar y para resolver problemas de contenido duplicado para sitios de optimización de SEO
solo agregue routes.MapMvcAttributeRoutes (); en su RouteConfig y luego defina una y única ruta para cada acción como
[Route("~/")]
public ActionResult Index(int? page)
{
var query = from p in db.Posts orderby p.post_date descending select p;
var pageNumber = page ?? 1;
ViewData["Posts"] = query.ToPagedList(pageNumber, 7);
return View();
}
[Route("about")]
public ActionResult About()
{
return View();
}
[Route("contact")]
public ActionResult Contact()
{
return View();
}
[Route("team")]
public ActionResult Team()
{
return View();
}
[Route("services")]
public ActionResult Services()
{
return View();
}
¡Bache!
MVC 5 Now Admite generar urls en minúsculas y una política de barra inclinada común.
public static void RegisterRoutes(RouteCollection routes)
{
routes.LowercaseUrls = true;
routes.AppendTrailingSlash = false;
}
También en mi aplicación para evitar el contenido duplicado en diferentes Dominios / Ip / Letter Casing, etc ...
Tiendo a producir URL canónicas basadas en un PrimaryDomain - Protocol - Controller - Language - Action
public static String GetCanonicalUrl(RouteData route,String host,string protocol)
{
//These rely on the convention that all your links will be lowercase!
string actionName = route.Values["action"].ToString().ToLower();
string controllerName = route.Values["controller"].ToString().ToLower();
//If your app is multilanguage and your route contains a language parameter then lowercase it also to prevent EN/en/ etc....
//string language = route.Values["language"].ToString().ToLower();
return String.Format("{0}://{1}/{2}/{3}/{4}", protocol, host, language, controllerName, actionName);
}
Luego puede usar la respuesta de @Gabe Sumner para redirigir a la url canónica de su acción si la URL actual de la solicitud no coincide.
Como tú, tuve la misma pregunta ; excepto que no estaba dispuesto a conformarme con una limitación de URL en minúsculas, y tampoco me gustó el enfoque canonical
(bueno, es bueno, pero no por sí solo).
No pude encontrar una solución, así que escribimos y abrimos una clase de redirección .
Usarlo es bastante fácil: cada método GET en las clases de controlador necesita agregar solo esta línea al comienzo:
Seo.SeoRedirect(this);
La clase de reescritura de SEO utiliza automáticamente los atributos de información de llamada de C # 5.0 para hacer el trabajo pesado, haciendo que el código anterior sea estrictamente de copiar y pegar.
Como mencioné en las Preguntas y Respuestas SO relacionadas, estoy trabajando en una forma de convertir esto en un atributo, pero por ahora, hace el trabajo.
El código forzará un caso para la URL. El caso será el mismo que el nombre del método del controlador: usted elige si quiere todos los topes, todos más bajos, o una combinación de ambos (CamelCase es bueno para las URL). Emitirá redireccionamientos 301 para coincidencias que no distinguen entre mayúsculas y minúsculas, y almacena los resultados en la memoria caché para un mejor rendimiento. También redirigirá las barras diagonales inversas (obligatorias para las listas de índices, de lo contrario se aplica) y eliminará el contenido duplicado al que se accedió mediante el nombre predeterminado del método ( Index
en una aplicación stock ASP.NET MVC).