{"id":11761,"date":"2026-11-10T12:30:36","date_gmt":"2026-11-10T11:30:36","guid":{"rendered":"https:\/\/www.loading.es\/blog\/?p=11761"},"modified":"2026-11-10T15:05:17","modified_gmt":"2026-11-10T14:05:17","slug":"optimizar-url-web-mejorar-seo","status":"publish","type":"post","link":"https:\/\/www.loading.es\/blog\/optimizar-url-web-mejorar-seo\/","title":{"rendered":"C\u00f3mo optimizar las URL de tu web para mejorar el SEO"},"content":{"rendered":"\n<p>Optimizar las URL para SEO puede ayudarte a tener una web m\u00e1s clara y f\u00e1cil de entender. Pero antes de cambiar una direcci\u00f3n, hay una pregunta m\u00e1s importante: <strong>\u00bfrealmente merece la pena modificarla?<\/strong><\/p>\n\n\n\n<p>Si est\u00e1s creando una p\u00e1gina, tienes la oportunidad de elegir una URL sencilla desde el principio. Si ya est\u00e1 publicada y recibe visitas, quiz\u00e1 lo mejor sea dejarla como est\u00e1. Vamos a ver c\u00f3mo tomar esa decisi\u00f3n y qu\u00e9 hacer si necesitas cambiarla.<\/p>\n\n\n\n<p><strong><em>Tabla de Contenidos:<\/em><\/strong><\/p>\n\n\n\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a href=\"#aioseo-comprueba-si-tu-url-esta-optimizada-para-seo\">Comprueba si tu URL est\u00e1 optimizada para SEO<\/a><\/li><li><a href=\"#aioseo-como-crear-una-url-optimizada-para-seo\">C\u00f3mo crear una URL optimizada para SEO<\/a><ul><li><a href=\"#aioseo-elige-palabras-que-describan-la-pagina\">Elige palabras que describan la p\u00e1gina<\/a><\/li><li><a href=\"#aioseo-hazla-facil-de-leer-y-compartir\">Hazla f\u00e1cil de leer y compartir<\/a><\/li><li><a href=\"#aioseo-organiza-las-direcciones-con-sentido\">Organiza las direcciones con sentido<\/a><\/li><\/ul><\/li><li><a href=\"#aioseo-cuando-conviene-cambiar-una-url-que-ya-esta-publicada\">\u00bfCu\u00e1ndo conviene cambiar una URL que ya est\u00e1 publicada?<\/a><ul><li><a href=\"#aioseo-casos-en-los-que-puede-tener-sentido\">Casos en los que puede tener sentido<\/a><\/li><li><a href=\"#aioseo-que-revisar-antes-de-decidir\">Qu\u00e9 revisar antes de decidir<\/a><\/li><\/ul><\/li><li><a href=\"#aioseo-como-cambiar-una-url-sin-perder-posicionamiento\">C\u00f3mo cambiar una URL sin perder posicionamiento<\/a><ul><li><a href=\"#aioseo-prepara-la-nueva-direccion-y-una-redireccion-301\">Prepara la nueva direcci\u00f3n y una redirecci\u00f3n 301<\/a><\/li><li><a href=\"#aioseo-cambia-la-direccion-en-wordpress\">Cambia la direcci\u00f3n en WordPress<\/a><\/li><li><a href=\"#aioseo-actualiza-los-enlaces-y-comprueba-el-resultado\">Actualiza los enlaces y comprueba el resultado<\/a><\/li><\/ul><\/li><li><a href=\"#aioseo-conclusion\">Conclusi\u00f3n<\/a><\/li><li><a href=\"#aioseo-preguntas-frecuentes-sobre-los-crm-open-source-faq\">Preguntas frecuentes sobre optimizar las URLs para mejorar el SEO (FAQ)<\/a><\/li><\/ul><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.loading.es\/hosting\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" loading=\"lazy\" width=\"1000\" height=\"100\" src=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb.png\" alt=\"oferta para contratar hosting web\" class=\"wp-image-8039\" srcset=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb.png 1000w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-300x30.png 300w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-768x77.png 768w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-850x85.png 850w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-comprueba-si-tu-url-esta-optimizada-para-seo\">Comprueba si tu URL est\u00e1 optimizada para SEO<\/h2>\n\n\n\n<p>Antes de hacer cambios, f\u00edjate en una de las direcciones de tu web. \u00bfPuedes hacerte una idea de su contenido con solo leerla? \u00bfTiene palabras claras o una mezcla de n\u00fameros y caracteres que no te dice nada?<\/p>\n\n\n\n<p>Introduce tu URL en la siguiente herramienta para obtener una <strong>revisi\u00f3n orientativa<\/strong> de su estructura y descubrir qu\u00e9 aspectos podr\u00edas mejorar.<\/p>\n\n\n\n<p>Ten en cuenta que la herramienta no puede saber por s\u00ed sola si una p\u00e1gina recibe visitas, tiene enlaces desde otras webs o est\u00e1 bien posicionada. Por eso, <strong>una sugerencia de mejora no significa que debas cambiar una URL publicada<\/strong>. M\u00e1s adelante te ayudamos a valorar si compensa hacerlo.<\/p>\n\n\n\n<style>\n#comp-ld-4101, #comp-ld-4101 * { box-sizing: border-box; }\n#comp-ld-4101 { color: inherit; font-family:'Manrope','Segoe UI',Arial,sans-serif; margin:28px 0; max-width:100%; min-width:0; font-size:16px; line-height:1.55; }\n#comp-ld-4101 .ld-app { border:1px solid #d5dfe2; border-top:3px solid #00bcdf; border-radius:22px; overflow:hidden; background:#fff; color:#37363d; box-shadow:0 14px 40px -22px rgba(55,54,61,.35); }\n#comp-ld-4101 [hidden] { display:none !important; }\n#comp-ld-4101 p { margin:0; padding:0; }\n#comp-ld-4101 button, #comp-ld-4101 input { font:inherit; letter-spacing:normal; text-transform:none; margin:0; max-width:100%; }\n#comp-ld-4101 button { cursor:pointer; border-radius:9px; box-shadow:none; line-height:1.35; transition:background .18s,border-color .18s,transform .18s; }\n#comp-ld-4101 button:disabled { cursor:default; opacity:.6; }\n#comp-ld-4101 button:focus-visible, #comp-ld-4101 input:focus-visible, #comp-ld-4101 summary:focus-visible { outline:3px solid #007d98; outline-offset:4px; }\n#comp-ld-4101 svg { width:24px; height:24px; flex:0 0 auto; vertical-align:middle; }\n#comp-ld-4101 .ld-top { padding:28px; background:#37363d; color:#fff; position:relative; }\n#comp-ld-4101 .ld-top::after { content:''; position:absolute; width:180px; height:180px; border:1px solid rgba(0,188,223,.14); border-radius:50%; right:-90px; top:-110px; pointer-events:none; }\n#comp-ld-4101 .ld-title { font-weight:750; font-size:1.25rem; line-height:1.35; letter-spacing:-.025em; }\n#comp-ld-4101 .ld-subtitle { color:#d9d8df; margin-top:5px; font-size:.9375rem; }\n#comp-ld-4101 .ld-form { margin:22px 0 0; padding:0; }\n#comp-ld-4101 fieldset { margin:0 0 19px; padding:0; border:0; min-width:0; }\n#comp-ld-4101 legend { font-size:.8125rem; color:#dfdee4; padding:0; margin-bottom:8px; }\n#comp-ld-4101 .ld-modes { display:inline-flex; flex-wrap:wrap; gap:5px; padding:4px; background:#2c2b31; border-radius:12px; max-width:100%; border:1px solid #62616b; }\n#comp-ld-4101 .ld-mode { position:relative; display:flex; align-items:center; padding:9px 13px; gap:8px; border-radius:8px; cursor:pointer; font-size:.875rem; color:#e3e2e8; }\n#comp-ld-4101 .ld-mode:has(input:checked), #comp-ld-4101 .ld-mode.is-checked { background:#f4f4f6; color:#37363d; font-weight:700; }\n#comp-ld-4101 .ld-mode input { appearance:auto; accent-color:#007f96; width:16px; height:16px; padding:0; border:initial; box-shadow:none; }\n#comp-ld-4101 .ld-label { display:block; font-size:.875rem; font-weight:650; margin-bottom:7px; color:#fff; }\n#comp-ld-4101 .ld-entry { display:flex; align-items:stretch; gap:10px; }\n#comp-ld-4101 .ld-input { min-width:0; width:100%; flex:1; border:1px solid #dbdce1; border-radius:9px; color:#37363d; background:#fff; padding:13px 14px; height:auto; font-size:1rem; line-height:1.45; box-shadow:none; }\n#comp-ld-4101 .ld-input::placeholder { color:#74727c; opacity:1; }\n#comp-ld-4101 .ld-input[aria-invalid=true] { border:2px solid #ffb695; }\n#comp-ld-4101 .ld-submit { display:inline-flex; justify-content:center; align-items:center; gap:10px; background:#db7424; color:#201d1a; border:1px solid #e78d46; font-weight:750; padding:12px 18px; white-space:nowrap; }\n#comp-ld-4101 .ld-submit:hover { background:#ee934c; transform:translateY(-1px); }\n#comp-ld-4101 .ld-top button:focus-visible, #comp-ld-4101 .ld-top input:focus-visible { outline-color:#58def4; }\n#comp-ld-4101 .ld-examples { display:flex; gap:7px; align-items:center; flex-wrap:wrap; margin-top:13px; color:#d9d8df; font-size:.8125rem; }\n#comp-ld-4101 .ld-example { padding:7px 10px; background:transparent; border:1px solid #777680; color:#fff; font-size:.8125rem; }\n#comp-ld-4101 .ld-example:hover { background:#4b4a53; border-color:#9cdbe5; }\n#comp-ld-4101 .ld-error { margin-top:12px; color:#ffd6c2; font-size:.875rem; }\n#comp-ld-4101 .ld-body { padding:27px 28px; }\n#comp-ld-4101 .ld-muted { color:#64616e; font-size:.875rem; margin-top:6px; }\n#comp-ld-4101 .ld-anatomy { display:flex; align-items:stretch; gap:4px; flex-wrap:wrap; padding:14px; border-radius:12px; margin-top:19px; background:#f4f4f6; min-width:0; }\n#comp-ld-4101 .ld-part { border:1px solid transparent; border-radius:5px; padding:5px 7px; color:#075d70; background:#d7f3f8; font-weight:650; font-size:.9375rem; max-width:100%; overflow-wrap:anywhere; word-break:break-word; text-align:left; }\n#comp-ld-4101 .ld-part:nth-child(2) { background:#fbe7d7; color:#7b3d12; }\n#comp-ld-4101 .ld-part:nth-child(4), #comp-ld-4101 .ld-part:nth-child(5) { background:#e4e4e9; color:#45434e; }\n#comp-ld-4101 button.ld-part:hover, #comp-ld-4101 button.ld-part[aria-pressed=true] { border-color:currentColor; }\n#comp-ld-4101 .ld-part-note { min-height:2.8em; font-size:.8125rem; margin-top:9px; color:#64616e; }\n#comp-ld-4101 .ld-explain { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:18px; margin:21px 0 0; padding:0; }\n#comp-ld-4101 .ld-explain > div { padding-left:13px; border-left:2px solid #cdeaf0; }\n#comp-ld-4101 .ld-explain > div:nth-child(2) { border-color:#f3c9a8; }\n#comp-ld-4101 dt { font-weight:700; font-size:.875rem; margin:0 0 5px; }\n#comp-ld-4101 dd { margin:0; color:#64616e; font-size:.8125rem; line-height:1.6; }\n#comp-ld-4101 .ld-result-head { display:flex; align-items:flex-start; gap:14px; }\n#comp-ld-4101 .ld-result-mark { display:flex; align-items:center; justify-content:center; background:#e4f3ed; color:#12633e; border-radius:50%; padding:9px; flex-shrink:0; }\n#comp-ld-4101 .ld-result-mark[data-tone=review] { background:#fff0e2; color:#8c420e; }\n#comp-ld-4101 .ld-result-title:focus { outline:none; }\n#comp-ld-4101 .ld-inferred { color:#74604f; font-size:.8125rem; margin-top:7px; }\n#comp-ld-4101 .ld-filters { display:flex; flex-wrap:wrap; align-items:center; gap:7px; margin:13px 0 16px; }\n#comp-ld-4101 .ld-filter { border:1px solid #d5d4db; padding:7px 12px; border-radius:22px; color:#54525f; background:#fff; font-size:.8125rem; font-weight:650; }\n#comp-ld-4101 .ld-filter[aria-pressed=true] { border-color:#007e96; background:#e6f7fa; color:#075d70; }\n#comp-ld-4101 .ld-check { border:0; border-bottom:1px solid #e5e5eb; margin:0; padding:0; background:none; }\n#comp-ld-4101 .ld-check summary { display:flex; align-items:center; gap:10px; cursor:pointer; padding:14px 0; list-style:none; font-size:.9375rem; font-weight:650; color:#37363d; }\n#comp-ld-4101 summary::-webkit-details-marker { display:none; }\n#comp-ld-4101 .ld-check summary::after { content:''; width:7px; height:7px; flex:0 0 auto; border-right:1.5px solid #74717e; border-bottom:1.5px solid #74717e; transform:rotate(45deg); margin:0 4px 4px 3px; transition:transform .18s; }\n#comp-ld-4101 .ld-check[open] summary::after { transform:rotate(225deg); margin-top:7px; }\n#comp-ld-4101 .ld-check summary:hover .ld-check-name { color:#8c420e; }\n#comp-ld-4101 .ld-check-icon { display:flex; color:#176d47; flex-shrink:0; }\n#comp-ld-4101 .ld-check-icon svg { width:20px; height:20px; }\n#comp-ld-4101 .ld-check[data-status=review] .ld-check-icon { color:#a65112; }\n#comp-ld-4101 .ld-check[data-status=info] .ld-check-icon { color:#00778e; }\n#comp-ld-4101 .ld-check-name { flex:1; }\n#comp-ld-4101 .ld-check-status { color:#176d47; background:#edf7f1; padding:3px 7px; font-size:.6875rem; line-height:1.4; border-radius:4px; font-weight:650; }\n#comp-ld-4101 .ld-check[data-status=review] .ld-check-status { color:#8c420e; background:#fff0e2; }\n#comp-ld-4101 .ld-check[data-status=info] .ld-check-status { color:#075d70; background:#eaf7f9; }\n#comp-ld-4101 .ld-check > p { padding:0 14px 15px 30px; color:#64616e; font-size:.875rem; }\n#comp-ld-4101 .ld-none { padding:15px 0; color:#64616e; font-size:.875rem; }\n#comp-ld-4101 .ld-advice { padding:15px 17px; margin-top:22px; border-left:3px solid #db7424; border-radius:0 9px 9px 0; background:#fff5ec; font-size:.875rem; color:#70401c; }\n#comp-ld-4101 .ld-advice[data-mode=new] { border-left-color:#198754; background:#eef8f2; color:#22583d; }\n#comp-ld-4101 .ld-advice strong { display:block; margin-bottom:4px; color:inherit; }\n#comp-ld-4101 .ld-proposal { margin-top:20px; padding:18px; border-radius:12px; background:#edf8fa; border:1px solid #cce7ed; }\n#comp-ld-4101 .ld-proposal-label { display:block; font-weight:700; font-size:1rem; margin:0 0 5px; color:#37363d; }\n#comp-ld-4101 .ld-proposal .ld-muted { margin:0 0 12px; }\n#comp-ld-4101 .ld-proposal .ld-input { padding:10px; font-size:.875rem; }\n#comp-ld-4101 .ld-copy { background:#fff; border:1px solid #99bdc5; color:#075d70; font-size:.8125rem; font-weight:700; padding:10px 14px; }\n#comp-ld-4101 .ld-copy:hover { background:#dff2f6; }\n#comp-ld-4101 .ld-copy-note { font-size:.8125rem; margin-top:8px; color:#42616a; }\n#comp-ld-4101 .ld-next { margin-top:18px; }\n#comp-ld-4101 .ld-reset { color:#64616e; border:0; background:transparent; text-decoration:underline; text-underline-offset:3px; padding:5px 0; font-size:.8125rem; }\n#comp-ld-4101 .ld-foot { padding:13px 28px; border-top:1px solid #e5e5eb; background:#f9f9fb; color:#64616e; font-size:.75rem; }\n#comp-ld-4101 .ld-foot details { margin-top:6px; }\n#comp-ld-4101 .ld-foot summary { cursor:pointer; text-decoration:underline; text-underline-offset:3px; }\n#comp-ld-4101 .ld-foot details p { margin-top:8px; max-width:76ch; }\n#comp-ld-4101 .ld-sr { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }\n@media (max-width:580px) {\n #comp-ld-4101 .ld-top, #comp-ld-4101 .ld-body { padding:22px 18px; }\n #comp-ld-4101 .ld-entry { flex-direction:column; }\n #comp-ld-4101 .ld-submit { padding:13px 16px; }\n #comp-ld-4101 .ld-modes { display:flex; }\n #comp-ld-4101 .ld-mode { flex:1 1 auto; padding:9px; font-size:.8125rem; }\n #comp-ld-4101 .ld-explain { gap:13px; grid-template-columns:1fr; }\n #comp-ld-4101 .ld-anatomy { padding:10px; }\n #comp-ld-4101 .ld-part { font-size:.8125rem; }\n #comp-ld-4101 .ld-check summary { gap:7px; font-size:.875rem; }\n #comp-ld-4101 .ld-check-status { max-width:60px; text-align:center; }\n #comp-ld-4101 .ld-foot { padding:13px 18px; }\n}\n@media (prefers-reduced-motion:reduce) { #comp-ld-4101 * { transition:none !important; animation:none !important; scroll-behavior:auto !important; } }\n<\/style>\n<div id=\"comp-ld-4101\">\n <div class=\"ld-app\">\n  <div class=\"ld-top\">\n   <div class=\"ld-title\">Mira tu URL con otros ojos<\/div>\n   <p class=\"ld-subtitle\">Entiende su estructura antes de cambiarla.<\/p>\n   <div class=\"ld-form\">\n    <fieldset><legend>\u00bfEn qu\u00e9 momento est\u00e1 esta p\u00e1gina?<\/legend><div class=\"ld-modes\">\n     <label class=\"ld-mode\"><input type=\"radio\" name=\"ld-4101-mode\" value=\"published\" checked>Ya est\u00e1 publicada<\/label>\n     <label class=\"ld-mode\"><input type=\"radio\" name=\"ld-4101-mode\" value=\"new\">Es una URL nueva<\/label>\n    <\/div><\/fieldset>\n    <label class=\"ld-label\" for=\"ld-4101-url\">URL de tu p\u00e1gina<\/label>\n    <div class=\"ld-entry\"><input class=\"ld-input\" id=\"ld-4101-url\" type=\"text\" inputmode=\"url\" autocomplete=\"off\" autocapitalize=\"none\" spellcheck=\"false\" placeholder=\"https:\/\/ejemplo.com\/tu-pagina\" aria-describedby=\"ld-4101-error ld-4101-privacy\"><button type=\"button\" class=\"ld-submit\">Analizar URL <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 12h16m-6-6 6 6-6 6\"\/><\/svg><\/button><\/div>\n    <div class=\"ld-error\" id=\"ld-4101-error\" role=\"alert\" hidden><\/div>\n    <div class=\"ld-examples\"><span>Prueba un ejemplo<\/span><button type=\"button\" class=\"ld-example\" data-example=\"guide\" disabled>Una gu\u00eda<\/button><button type=\"button\" class=\"ld-example\" data-example=\"shop\" disabled>Una tienda<\/button><button type=\"button\" class=\"ld-example\" data-example=\"params\" disabled>Con par\u00e1metros<\/button><\/div>\n   <\/div>\n   <noscript><p>Activa JavaScript en tu navegador para utilizar la herramienta. Las recomendaciones del art\u00edculo siguen disponibles.<\/p><\/noscript>\n  <\/div>\n  <div class=\"ld-body ld-empty\">\n   <div class=\"ld-title\">Una direcci\u00f3n, varias pistas<\/div>\n   <p class=\"ld-muted\">Pega tu URL o prueba un ejemplo para empezar.<\/p>\n   <div class=\"ld-anatomy\" aria-label=\"Ejemplo de las partes de una URL\"><span class=\"ld-part\">https:\/\/<\/span><span class=\"ld-part\">ejemplo.com<\/span><span class=\"ld-part\">\/blog\/cuidados-monstera<\/span><\/div>\n   <dl class=\"ld-explain\"><div><dt>Conexi\u00f3n<\/dt><dd>El comienzo indica el protocolo, como HTTPS.<\/dd><\/div><div><dt>Dominio<\/dt><dd>El nombre del sitio al que pertenece la direcci\u00f3n.<\/dd><\/div><div><dt>Ruta<\/dt><dd>El camino hasta una p\u00e1gina dentro de ese sitio.<\/dd><\/div><\/dl>\n  <\/div>\n  <div class=\"ld-body ld-results\" hidden>\n   <div class=\"ld-result-head\"><span class=\"ld-result-mark\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"m5 13 4 4L19 7\"\/><\/svg><\/span><div><div class=\"ld-title ld-result-title\" tabindex=\"-1\"><\/div><p class=\"ld-muted ld-result-text\"><\/p><\/div><\/div>\n   <div class=\"ld-anatomy ld-result-parts\" role=\"group\" aria-label=\"Explora las partes de tu URL\"><\/div>\n   <p class=\"ld-inferred\" hidden><\/p><p class=\"ld-part-note\" aria-live=\"polite\">Toca una parte para ver qu\u00e9 representa.<\/p>\n   <div class=\"ld-filters\" role=\"group\" aria-label=\"Filtrar observaciones\"><button type=\"button\" class=\"ld-filter\" data-filter=\"all\" aria-pressed=\"true\">Todo<\/button><button type=\"button\" class=\"ld-filter\" data-filter=\"good\" aria-pressed=\"false\">A favor<\/button><button type=\"button\" class=\"ld-filter\" data-filter=\"review\" aria-pressed=\"false\">Para revisar<\/button><\/div>\n   <div class=\"ld-checks\"><\/div><p class=\"ld-none\" hidden>No hay observaciones en este grupo.<\/p>\n   <div class=\"ld-advice\"><strong class=\"ld-advice-title\"><\/strong><p class=\"ld-advice-text\"><\/p><\/div>\n   <div class=\"ld-proposal\" hidden><label class=\"ld-proposal-label\" for=\"ld-4101-proposal\">Una alternativa para valorar<\/label><p class=\"ld-muted ld-proposal-reasons\"><\/p><div class=\"ld-entry\"><input type=\"text\" id=\"ld-4101-proposal\" class=\"ld-input\" readonly spellcheck=\"false\" aria-describedby=\"ld-4101-proposal-caution\"><button type=\"button\" class=\"ld-copy\">Copiar<\/button><\/div><p class=\"ld-copy-note\" id=\"ld-4101-proposal-caution\"><\/p><p class=\"ld-copy-note ld-copy-status\" role=\"status\" hidden><\/p><\/div>\n   <div class=\"ld-next\"><button class=\"ld-reset\" type=\"button\">Probar otra URL<\/button><\/div>\n  <\/div>\n  <div class=\"ld-foot\"><p id=\"ld-4101-privacy\">El an\u00e1lisis se hace en tu navegador. No visitamos la p\u00e1gina ni guardamos tu URL.<\/p><details><summary>Qu\u00e9 puede comprobar esta herramienta<\/summary><p>Revisa solo el texto de la direcci\u00f3n: protocolo, dominio, ruta y par\u00e1metros. No consulta contenido, tr\u00e1fico, enlaces, posici\u00f3n en Google, indexaci\u00f3n, redirecciones ni el certificado de seguridad. Tampoco confirma que la p\u00e1gina exista. El diagn\u00f3stico es orientativo; no calcula una puntuaci\u00f3n SEO.<\/p><\/details><\/div>\n   <div class=\"ld-sr ld-announcement\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/div>\n <\/div>\n<\/div>\n<script>\n(function () {\n 'use strict';\n \/\/ El editor de Loading ha convertido ampersands en entidades HTML al publicar este script.\n \/\/ Evita que dos copias del bloque instalen dos veces los mismos manejadores.\n if (window.__ldUrlSeoBooted) return;\n window.__ldUrlSeoBooted = true;\n\n \/\/ Motor local y orientativo: no hace peticiones ni comprueba indexaci\u00f3n,\n \/\/ disponibilidad del host, compatibilidad HTTPS o certificados.\n var MAX_LENGTH = 10000;\n var SENSITIVE_QUERY_RE = \/token|auth|signature|(^|[^a-z])sig(nature)?([^a-z]|$)|secret|password|passwd|api.?key|access.?key|credential|session|jwt|bearer|oauth\/i;\n var SENSITIVE_PATH_RE = \/^(?:token|auth|authorization|signature|sig|secret|password|passwd|api.?key|access.?key|credential|session|jwt|bearer|oauth)$\/i;\n\n function normalizedMode(mode) {\n  return mode === 'new' || mode === 'nueva' ? 'new' : 'published';\n }\n\n function errorResult(message, mode, assumedProtocol) {\n  return {\n   ok: false,\n   error: message,\n   normalized: null,\n   assumedProtocol: !!assumedProtocol,\n   parts: [],\n   summary: { title: 'No se pudo analizar la direcci\u00f3n', text: message },\n   checks: [],\n   proposal: null,\n   mode: mode\n  };\n }\n\n function isStrictIPv4(host) {\n  var octets = host.split('.');\n  if (octets.length !== 4) return false;\n  return octets.every(function (octet) {\n   if (!\/^\\d{1,3}$\/.test(octet)) return false;\n   if (!(octet.length <= 1 || octet[0] !== '0')) return false;\n   return Number(octet) <= 255;\n  });\n }\n\n function invalidHostMessage() {\n  return 'No puedo interpretar el dominio. Revisa el nombre, los puntos y, si es IPv6, que est\u00e9 entre corchetes.';\n }\n\n function parseAuthority(authority, scheme) {\n  if (!authority) return { error: 'Falta el dominio de la direcci\u00f3n.' };\n  if (authority.indexOf('@') >= 0) {\n   return { error: 'La URL incluye credenciales. Ret\u00edralas antes de analizarla; no se mostrar\u00e1n aqu\u00ed.' };\n  }\n  if (\/\\s\/u.test(authority)) {\n   return { error: 'El dominio contiene espacios. Corrige esa parte; los espacios solo se aceptan en la ruta y se codifican como %20.' };\n  }\n  if (authority.indexOf('\\\\') >= 0) return { error: invalidHostMessage() };\n\n  var host = authority;\n  var port = null;\n  if (authority.charAt(0) === '[') {\n   var close = authority.indexOf(']');\n   if (close < 0) return { error: invalidHostMessage() };\n   host = authority.slice(0, close + 1);\n   var remainder = authority.slice(close + 1);\n   if (remainder) {\n    if (!\/^:\\d+$\/.test(remainder)) return { error: 'El puerto debe ser un n\u00famero entre 0 y 65535.' };\n    port = remainder.slice(1);\n   }\n  } else {\n   var colonCount = (authority.match(\/:\/g) || []).length;\n   if (colonCount > 1) return { error: invalidHostMessage() };\n   if (colonCount === 1) {\n    var colon = authority.lastIndexOf(':');\n    host = authority.slice(0, colon);\n    var rawPort = authority.slice(colon + 1);\n    if (!\/^\\d+$\/.test(rawPort)) return { error: 'El puerto debe ser un n\u00famero entre 0 y 65535.' };\n    port = rawPort;\n   }\n  }\n\n  if (!host || host.indexOf('%') >= 0) return { error: invalidHostMessage() };\n  if (port === null ? false : Number(port) > 65535) {\n   return { error: 'El puerto debe ser un n\u00famero entre 0 y 65535.' };\n  }\n\n  var parsed;\n  try {\n   parsed = new URL(scheme + ':\/\/' + authority + '\/');\n  } catch (_) {\n   return { error: invalidHostMessage() };\n  }\n  if (!parsed.hostname || parsed.username || parsed.password) {\n   return { error: invalidHostMessage() };\n  }\n\n  if (host.charAt(0) === '[') {\n   if (host.charAt(host.length - 1) !== ']' || parsed.hostname.charAt(0) !== '[') {\n    return { error: invalidHostMessage() };\n   }\n  } else {\n   var asciiHost = parsed.hostname.toLowerCase();\n   if (!(!\/^[0-9.]+$\/.test(host) || isStrictIPv4(host))) {\n    return { error: invalidHostMessage() };\n   }\n   \/\/ WHATWG URL puede reinterpretar formas IPv4 ambiguas (por ejemplo, 127.1\n   \/\/ o 0x7f.0.0.1); se rechazan para conservar la identidad escrita del host.\n   if (!(!\/^[\\x00-\\x7f]+$\/.test(host) || asciiHost === host.toLowerCase())) {\n    return { error: invalidHostMessage() };\n   }\n   var withoutFinalDot = asciiHost.charAt(asciiHost.length - 1) === '.' ? asciiHost.slice(0, -1) : asciiHost;\n   if (!withoutFinalDot || withoutFinalDot.length > 253) return { error: invalidHostMessage() };\n   var labels = withoutFinalDot.split('.');\n   if (labels.some(function (label) { return label.length < 1 || label.length > 63 || !\/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$\/.test(label); })) {\n    return { error: invalidHostMessage() };\n   }\n  }\n\n  return { host: host, port: port };\n }\n\n function splitTail(tail) {\n  var hashAt = tail.indexOf('#');\n  var beforeHash = hashAt >= 0 ? tail.slice(0, hashAt) : tail;\n  var hash = hashAt >= 0 ? tail.slice(hashAt) : '';\n  var queryAt = beforeHash.indexOf('?');\n  var path = queryAt >= 0 ? beforeHash.slice(0, queryAt) : beforeHash;\n  var query = queryAt >= 0 ? beforeHash.slice(queryAt) : '';\n  return { path: path, query: query, hash: hash };\n }\n\n function queryHasSensitiveKey(query) {\n  if (!query) return false;\n  return query.slice(1).split('\\x26').some(function (pair) {\n   var rawKey = pair.split('=', 1)[0].replace(\/\\+\/g, ' ');\n   var key = rawKey;\n   try { key = decodeURIComponent(rawKey); } catch (_) { \/* los escapes ya se validaron *\/ }\n   return SENSITIVE_QUERY_RE.test(key);\n  });\n }\n\n function pathHasSensitiveSignal(path) {\n  return path.toLowerCase().split(\/[\\\/._\\-\\s]+\/).some(function (token) {\n   return SENSITIVE_PATH_RE.test(token);\n  });\n }\n\n function isUuid(segment) {\n  return \/^[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$\/i.test(segment)\n   || \/^[0-9a-f]{32}$\/i.test(segment);\n }\n\n function isIdLike(segment) {\n  return \/^\\d+$\/.test(segment)\n   || isUuid(segment)\n   || \/^[0-9a-f]{8,}$\/i.test(segment)\n   || !(!\/^[a-z0-9]{10,}$\/i.test(segment) || !\/[a-z]\/i.test(segment) || !\/\\d\/.test(segment))\n   || \/\\d{6,}\/.test(segment);\n }\n\n \/\/ Busca pistas de lectura sin intentar adivinar d\u00f3nde acaba cada palabra.\n function joinedWordSignal(segments, host) {\n  var hostLabels = host.toLowerCase().split('.');\n  var longWord = false;\n  for (var segment of segments) {\n   var decoded;\n   try { decoded = decodeURIComponent(segment); } catch (_) { continue; }\n   if (!\/^[\\p{L}\\p{M}]+(?:-[\\p{L}\\p{M}]+)*$\/u.test(decoded)) continue;\n   for (var token of decoded.toLowerCase().split('-')) {\n    if (hostLabels.includes(token)) continue;\n    if (\/^[\\p{L}\\p{M}]{3,}(?:enmi|entu|conmi|contu|parami|paratu)(?:web|sitio|tienda|p[a\\u00e1]gina|blog|dominio|hosting|wordpress)[\\p{L}\\p{M}]*$\/u.test(token)\n      || \/^como(?:hacer|crear|usar|regar|cuidar|instalar|cambiar|mejorar|optimizar)[\\p{L}\\p{M}]{3,}$\/u.test(token)) return 'likely';\n    if (token.length >= 20) longWord = true;\n   }\n  }\n  return longWord ? 'possible' : '';\n }\n\n function pathSignals(path, host) {\n  var segments = path.split('\/').filter(Boolean);\n  var tokens = path.split(\/[\\\/\\-_ \\t]+\/).filter(Boolean).map(function (word) { return word.toLowerCase(); });\n  var tokenCounts = {};\n  tokens.forEach(function (token) { tokenCounts[token] = (tokenCounts[token] || 0) + 1; });\n  var repeatedWord = Object.keys(tokenCounts).some(function (word) {\n   return word.length >= 3 ? tokenCounts[word] > 1 : false;\n  });\n  var repeatedSegment = segments.some(function (segment, index) { return segments.indexOf(segment) !== index; });\n  var fileLike = \/\\.[a-z0-9]{1,10}$\/i.test(segments[segments.length - 1] || '');\n  var opaque = segments.some(isIdLike);\n  return {\n   segments: segments,\n   hasSpaces: path.indexOf(' ') >= 0,\n   hasEncodedSpaces: \/%20\/i.test(path),\n   hasUnderscore: path.indexOf('_') >= 0,\n   hasUppercase: \/[A-Z]\/.test(path.replace(\/%[0-9a-f]{2}\/gi, '')),\n   hasDigits: segments.some(function (segment) { return \/\\d\/.test(segment.replace(\/%20\/gi, '')); }),\n   repeatedWord: repeatedWord,\n   repeatedSegment: repeatedSegment,\n   fileLike: fileLike,\n   opaque: opaque,\n   joinedWords: fileLike ? '' : joinedWordSignal(segments, host),\n   sensitive: pathHasSensitiveSignal(path)\n  };\n }\n\n function makeProposal(options) {\n  var scheme = options.scheme, authority = options.authority, path = options.path;\n  var query = options.query, hash = options.hash, mode = options.mode, signals = options.signals;\n  if (!path || path === '\/' || query || signals.hashSensitive || signals.hashRoute || signals.fileLike\n      || signals.opaque || signals.hasDigits || signals.sensitive) return null;\n  if (!\/^\\\/(?:%20|[A-Za-z _-])+(?:\\\/(?:%20|[A-Za-z _-])+)*\\\/?$\/i.test(path)) return null;\n\n  var segments = path.slice(1).split('\/');\n  var trailingSlash = segments[segments.length - 1] === '';\n  if (trailingSlash) segments.pop();\n  if (!segments.length || segments.some(function (segment) { return !\/[A-Za-z]\/.test(segment); })) return null;\n  var proposedPath = '\/' + segments\n   .map(function (segment) { return segment.replace(\/%20\/gi, '-').replace(\/[ _]\/g, '-').toLowerCase(); })\n   .join('\/') + (trailingSlash ? '\/' : '');\n  if (proposedPath === path) return null;\n\n  var reasons = [];\n  if (signals.hasUppercase) reasons.push('Convierte las letras may\u00fasculas de la ruta a min\u00fasculas.');\n  if (signals.hasSpaces || signals.hasEncodedSpaces || signals.hasUnderscore) {\n   reasons.push('Convierte espacios y guiones bajos en guiones, sin quitar palabras.');\n  }\n  if (!reasons.length) return null;\n  var caution = mode === 'published'\n   ? 'Es una opci\u00f3n de formato; no garantiza mejores posiciones. Comprueba que describe la p\u00e1gina y, si la cambias, prepara una redirecci\u00f3n 301.'\n   : 'Es una opci\u00f3n de formato; no garantiza mejores posiciones. Comprueba que describe el contenido antes de publicar.';\n  return { url: scheme + ':\/\/' + authority + proposedPath + hash, reasons: reasons, caution: caution };\n }\n\n function analyzeUrl(raw, mode) {\n  var currentMode = normalizedMode(mode);\n  if (typeof raw !== 'string') return errorResult('Introduce una direcci\u00f3n web como texto.', currentMode, false);\n  if (raw.length > MAX_LENGTH) return errorResult('La direcci\u00f3n supera el m\u00e1ximo de 10.000 caracteres.', currentMode, false);\n  if (!raw.trim()) return errorResult('Introduce una direcci\u00f3n web para analizar.', currentMode, false);\n  if (\/[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]\/u.test(raw)) {\n   return errorResult('La direcci\u00f3n contiene caracteres de control. Elim\u00ednalos y vuelve a intentarlo.', currentMode, false);\n  }\n  raw = raw.trim();\n  if (\/%(?![0-9a-f]{2})\/i.test(raw)) {\n   return errorResult('Hay un s\u00edmbolo % mal formado en la direcci\u00f3n. Copia la URL completa desde la barra de tu navegador y vuelve a intentarlo.', currentMode, false);\n  }\n\n  var scheme = 'https';\n  var assumedProtocol = true;\n  var rest = raw;\n  var explicit = raw.match(\/^([a-z][a-z0-9+.-]*):\\\/\\\/\/i);\n  if (explicit) {\n   scheme = explicit[1].toLowerCase();\n   assumedProtocol = false;\n   rest = raw.slice(explicit[0].length);\n   if (!['http', 'https'].includes(scheme)) {\n    return errorResult('Esta herramienta analiza direcciones de p\u00e1ginas web HTTP\/HTTPS. mailto abre correo, ftp sirve para transferir archivos y javascript:\/data: no son p\u00e1ginas web HTTP\/HTTPS.', currentMode, false);\n   }\n  } else {\n   var schemeLike = raw.match(\/^([a-z][a-z0-9+.-]*):\/i);\n   if (schemeLike) {\n    var name = schemeLike[1].toLowerCase();\n    var remainder = raw.slice(schemeLike[0].length);\n    var knownNonWeb = ['ftp', 'mailto', 'javascript', 'data'].indexOf(name) >= 0;\n    var looksLikeHostPort = !(['http', 'https'].includes(name) || knownNonWeb || !\/^\\d+(?:[\/?#]|$)\/.test(remainder));\n    if (!looksLikeHostPort) {\n     if (name === 'http' || name === 'https') {\n      return errorResult('La direcci\u00f3n web debe empezar por http:\/\/ o https:\/\/, o ser un dominio sin protocolo.', currentMode, false);\n     }\n     return errorResult('Esta herramienta analiza direcciones de p\u00e1ginas web HTTP\/HTTPS. mailto abre correo, ftp sirve para transferir archivos y javascript:\/data: no son p\u00e1ginas web HTTP\/HTTPS.', currentMode, false);\n    }\n   }\n   if (raw.charAt(0) === '\/' || raw.charAt(0) === '?' || raw.charAt(0) === '#'\n       || raw.slice(0, 2) === '.\/' || raw.slice(0, 3) === '..\/' || raw.charAt(0) === '\\\\') {\n    return errorResult('La direcci\u00f3n parece relativa. Introduce un dominio completo, como example.com\/ruta.', currentMode, false);\n   }\n  }\n\n  var boundary = rest.search(\/[\/?#]\/);\n  var authority = boundary < 0 ? rest : rest.slice(0, boundary);\n  var tail = boundary < 0 ? '' : rest.slice(boundary);\n  var suffix = splitTail(tail);\n  var rawPath = suffix.path;\n  var parameters = suffix.query;\n  var fragment = suffix.hash;\n  var parsedAuthority = parseAuthority(authority, scheme);\n  if (parsedAuthority.error) return errorResult(parsedAuthority.error, currentMode, assumedProtocol);\n  if (rawPath.indexOf('\\\\') >= 0) {\n   return errorResult('La ruta contiene una barra invertida. Usa \/ para separar sus partes.', currentMode, assumedProtocol);\n  }\n  if (parameters.indexOf(' ') >= 0 || fragment.indexOf(' ') >= 0) {\n   return errorResult('Los espacios solo se aceptan en la ruta. Codif\u00edcalos antes de analizar los par\u00e1metros o el fragmento.', currentMode, assumedProtocol);\n  }\n\n  \/\/ Sin protocolo, una etiqueta sola se confunde con una ruta relativa.\n  \/\/ Se permiten localhost e IP; con HTTP\/HTTPS expl\u00edcito se acepta un host interno.\n  var isBracketedIpv6 = parsedAuthority.host.charAt(0) === '[';\n  var isIp = isBracketedIpv6 || isStrictIPv4(parsedAuthority.host);\n  if (!(!assumedProtocol || parsedAuthority.host.includes('.') || parsedAuthority.host.toLowerCase() === 'localhost' || isIp)) {\n   return errorResult('El dominio parece incompleto. A\u00f1ade un dominio completo, como example.com; localhost tambi\u00e9n se permite.', currentMode, true);\n  }\n\n  var path = rawPath || '\/';\n  var normalized = scheme + ':\/\/' + authority + path.replace(\/ \/g, '%20') + parameters + fragment;\n  try {\n   \/\/ Validaci\u00f3n local de sintaxis; no reescribe el dominio, la ruta ni sus par\u00e1metros.\n   new URL(normalized);\n  } catch (_) {\n   return errorResult('No puedo interpretar esta direcci\u00f3n. Revisa su estructura, dominio y puerto.', currentMode, assumedProtocol);\n  }\n\n  var parametersSensitive = queryHasSensitiveKey(parameters);\n  var fragmentSensitive = SENSITIVE_QUERY_RE.test(fragment);\n  var fragmentRoute = \/^#(?:!)?\\\/\/.test(fragment);\n  var signals = pathSignals(rawPath || '\/', parsedAuthority.host);\n  signals.hashSensitive = fragmentSensitive;\n  signals.hashRoute = fragmentRoute;\n  var hasParameters = parameters !== '';\n  var hasFragment = fragment !== '';\n  var routeNotes = [];\n  if (signals.hasSpaces) routeNotes.push('Los espacios de la ruta se representan como %20.');\n  if (signals.hasEncodedSpaces) routeNotes.push('La ruta contiene espacios codificados como %20.');\n  if (signals.hasUnderscore) routeNotes.push('La ruta usa guiones bajos (_). Para separar palabras, valora guiones (-), m\u00e1s f\u00e1ciles de reconocer al leer la direcci\u00f3n.');\n  if (signals.joinedWords === 'likely') {\n   routeNotes.push('Un tramo parece contener varias palabras juntas. Si es as\u00ed, sep\u00e1ralas con guiones (-) para que se entienda mejor, como en \/guia-de-wordpress\/.');\n  } else if (signals.joinedWords === 'possible') {\n   routeNotes.push('Hay un tramo largo sin separadores. Si contiene varias palabras, los guiones (-) ayudan a leerlo. Si es un nombre o una sola palabra, puedes dejarlo tal cual.');\n  }\n  if (signals.hasUppercase) routeNotes.push('La ruta contiene may\u00fasculas; comprueba si su forma es intencional.');\n  if (signals.repeatedWord) routeNotes.push('Se repite alg\u00fan t\u00e9rmino en la ruta; confirma que sea intencional.');\n  if (signals.opaque) routeNotes.push('Hay un tramo num\u00e9rico o parecido a un identificador; puede ser v\u00e1lido y no conviene cambiarlo sin conocer su funci\u00f3n.');\n  if (signals.sensitive) routeNotes.push('La ruta incluye una se\u00f1al asociada a acceso o autenticaci\u00f3n; confirma que sea p\u00fablica antes de compartirla.');\n  if (signals.fileLike) routeNotes.push('La ruta parece apuntar a un archivo; conserva el nombre y la extensi\u00f3n si ese es su prop\u00f3sito.');\n  if (!(routeNotes.length || !\/[^\\x00-\\x7f]\/.test(rawPath))) routeNotes.push('Los caracteres internacionales, incluidas las tildes, se conservan.');\n  if (path === '\/') routeNotes.push('Es la direcci\u00f3n principal del sitio. Es normal que no tenga una ruta descriptiva.');\n  if (!routeNotes.length) routeNotes.push('No se observa una se\u00f1al estructural que requiera cambio; confirma que las palabras describan el contenido.');\n\n  var routeNeedsReview = signals.hasSpaces || signals.hasEncodedSpaces || signals.hasUnderscore\n   || signals.hasUppercase || signals.repeatedWord || signals.sensitive || Boolean(signals.joinedWords);\n  var parts = [\n   { label: 'Conexi\u00f3n', value: scheme + ':\/\/' },\n   { label: 'Dominio', value: authority },\n   { label: 'Ruta', value: rawPath || '\/' }\n  ];\n  if (hasParameters) parts.push({\n   label: 'Par\u00e1metros',\n   value: parametersSensitive ? '? [valor potencialmente sensible omitido]' : parameters\n  });\n  if (hasFragment) parts.push({\n   label: 'Fragmento',\n   value: fragmentSensitive ? '# [valor potencialmente sensible omitido]' : fragment\n  });\n\n  var extraNotes = [];\n  if (parametersSensitive || fragmentSensitive) {\n   extraNotes.push('Los par\u00e1metros o el fragmento parecen incluir una clave o credencial; sus valores se omiten. Evita compartirlos y revisa su funci\u00f3n.');\n  }\n  if (fragmentRoute) {\n   extraNotes.push('El fragmento empieza por \/ o !\/ y puede cargar contenido. Revisa c\u00f3mo lo usa el sitio antes de cambiar la direcci\u00f3n; esta herramienta no consulta indexaci\u00f3n.');\n  }\n  if (!(!hasParameters || parametersSensitive)) {\n   extraNotes.push('Los par\u00e1metros se conservan tal cual y pueden tener una funci\u00f3n t\u00e9cnica o de campa\u00f1a. No se propone cambiar la ruta cuando hay par\u00e1metros.');\n  }\n  if (!(!hasFragment || fragmentSensitive || fragmentRoute)) extraNotes.push('El fragmento se conserva tal cual.');\n  if (!extraNotes.length) extraNotes.push('No hay par\u00e1metros ni fragmento que revisar.');\n\n  var checks = [\n   {\n    key: 'connection',\n    status: scheme === 'http' ? 'review' : scheme !== 'https' || assumedProtocol ? 'info' : 'good',\n    title: 'Conexi\u00f3n',\n    text: scheme === 'http'\n     ? 'El protocolo es HTTP. Comprueba por separado si el sitio ofrece HTTPS antes de plantear un cambio; aqu\u00ed no se da por hecho.'\n     : assumedProtocol\n      ? 'Se asumi\u00f3 HTTPS porque no se indic\u00f3 protocolo. Esto no confirma que el sitio lo soporte ni verifica certificados.'\n      : 'La direcci\u00f3n empieza por HTTPS, el formato habitual para conexiones cifradas. Aqu\u00ed no comprobamos que la conexi\u00f3n ni el certificado funcionen.'\n   },\n   {\n    key: 'domain',\n    status: 'info',\n    title: 'Dominio',\n    text: 'Hemos identificado el nombre del sitio en la direcci\u00f3n. No hemos comprobado que exista ni que la p\u00e1gina abra.'\n   },\n   {\n    key: 'route',\n    status: routeNeedsReview ? 'review' : signals.opaque || signals.fileLike ? 'info' : 'good',\n    title: 'Lectura de la ruta',\n    text: routeNotes.join(' ')\n   },\n   {\n    key: 'organization',\n    status: 'info',\n    title: 'Organizaci\u00f3n',\n    text: signals.repeatedSegment\n     ? 'Se repite un tramo de la ruta. Confirma que la organizaci\u00f3n sea intencional; la cantidad de niveles no se penaliza.'\n     : 'La cantidad de niveles no se penaliza; comprueba que cada tramo ayude a ubicar el contenido.'\n   },\n   {\n    key: 'extras',\n    status: parametersSensitive || fragmentSensitive || fragmentRoute ? 'review' : hasParameters || hasFragment ? 'info' : 'good',\n    title: 'Par\u00e1metros y fragmento',\n    text: extraNotes.join(' ')\n   }\n  ];\n\n  var hasReview = scheme === 'http' || routeNeedsReview || parametersSensitive || fragmentSensitive || fragmentRoute;\n  var title = hasReview ? 'Hay detalles que puedes revisar' : 'Sin cambios evidentes en la estructura';\n  var summaryText = 'Abre las observaciones y confirma que las palabras de la ruta describan el contenido.';\n  var proposal = makeProposal({\n   scheme: scheme,\n   authority: authority,\n   path: rawPath,\n   query: parameters,\n   hash: fragment,\n   mode: currentMode,\n   signals: signals\n  });\n\n  return {\n   ok: true,\n   normalized: normalized,\n   assumedProtocol: assumedProtocol,\n   parts: parts,\n   summary: { title: title, text: summaryText },\n   checks: checks,\n   proposal: proposal,\n   mode: currentMode\n  };\n }\n\n \/\/ ---------------------------------------------------------------------------\n \/\/ Interfaz. No depende de cu\u00e1ndo se ejecute el script: los clics se escuchan\n \/\/ en el documento y cada bloque se inicializa en cuanto existe en el DOM.\n \/\/ ---------------------------------------------------------------------------\n var ROOT_ID = 'comp-ld-4101';\n var SVG_NS = 'http:\/\/www.w3.org\/2000\/svg';\n var LABELS = { good: 'A favor', review: 'Para revisar', info: 'Contexto' };\n var EXAMPLES = {\n  guide: 'https:\/\/ejemplo.com\/blog\/Cuidados_Monstera',\n  shop: 'https:\/\/ejemplo.com\/plantas\/interior\/monstera',\n  params: 'https:\/\/ejemplo.com\/plantas?color=verde\\x26orden=precio#resultados'\n };\n\n function findRoot(node) {\n  while (node?.nodeType === 1) {\n   if (node.id === ROOT_ID) return node;\n   node = node.parentNode;\n  }\n  return null;\n }\n\n function closestClass(node, cls, stop) {\n  while (node?.nodeType === 1) {\n   if (node.classList?.contains(cls)) return node;\n   if (node === stop) return null;\n   node = node.parentNode;\n  }\n  return null;\n }\n\n function state(root) {\n  var cached = root.__ldUrlSeo;\n  if (cached?.input) {\n   if (document.documentElement.contains(cached.input)) return cached;\n  }\n  var s = {\n   root: root,\n   input: root.querySelector('#ld-4101-url'),\n   error: root.querySelector('.ld-error'),\n   result: root.querySelector('.ld-results'),\n   empty: root.querySelector('.ld-empty'),\n   announce: root.querySelector('.ld-announcement'),\n   checks: root.querySelector('.ld-checks'),\n   parts: root.querySelector('.ld-result-parts'),\n   proposal: root.querySelector('#ld-4101-proposal'),\n   copyStatus: root.querySelector('.ld-copy-status'),\n   filter: 'all',\n   current: null,\n   lastRaw: ''\n  };\n  if (!s.input || !s.error || !s.result || !s.empty || !s.announce || !s.checks || !s.parts) return null;\n  root.__ldUrlSeo = s;\n  return s;\n }\n\n function currentMode(root) {\n  var checked = root.querySelector('input[name=\"ld-4101-mode\"]:checked');\n  return checked?.value || 'published';\n }\n\n function syncModes(root) {\n  var labels = root.querySelectorAll('.ld-mode');\n  for (var i = 0; i < labels.length; i++) {\n   var radio = labels[i].querySelector('input');\n   var on = Boolean(radio?.checked);\n   if (on) labels[i].classList.add('is-checked');\n   else labels[i].classList.remove('is-checked');\n  }\n }\n\n function create(tag, cls, text) {\n  var el = document.createElement(tag);\n  if (cls) el.className = cls;\n  if (text != null) el.textContent = text;\n  return el;\n }\n\n function icon(status) {\n  var svg = document.createElementNS(SVG_NS, 'svg');\n  svg.setAttribute('viewBox', '0 0 24 24');\n  svg.setAttribute('fill', 'none');\n  svg.setAttribute('stroke', 'currentColor');\n  svg.setAttribute('stroke-width', '1.8');\n  svg.setAttribute('stroke-linecap', 'round');\n  svg.setAttribute('stroke-linejoin', 'round');\n  svg.setAttribute('aria-hidden', 'true');\n  var circle = document.createElementNS(SVG_NS, 'circle');\n  circle.setAttribute('cx', '12');\n  circle.setAttribute('cy', '12');\n  circle.setAttribute('r', '9');\n  svg.appendChild(circle);\n  var path = document.createElementNS(SVG_NS, 'path');\n  path.setAttribute('d', status === 'good' ? 'm8 12 3 3 5-6' : status === 'review' ? 'M12 7v6m0 3h.01' : 'M12 11v6m0-10h.01');\n  svg.appendChild(path);\n  return svg;\n }\n\n function partDescription(index, part) {\n  if (index === 0) return 'Conexi\u00f3n: indica el protocolo de la URL. No hemos comprobado el certificado ni que la web abra.';\n  if (index === 1) return 'Dominio o servidor: identifica el destino escrito. No se ha comprobado que exista.';\n  if (index === 2) return 'Ruta: se\u00f1ala una p\u00e1gina dentro del sitio. Comprueba que sus palabras describen bien el contenido.';\n  if (part.label === 'Par\u00e1metros') return 'Par\u00e1metros: pueden activar filtros o identificar contenido. No los borres sin saber para qu\u00e9 sirven.';\n  return 'Fragmento: lo que va despu\u00e9s de # puede llevar a una secci\u00f3n de la p\u00e1gina. Tambi\u00e9n se usa en algunas aplicaciones.';\n }\n\n function resetFilters(root) {\n  var filters = root.querySelectorAll('.ld-filter');\n  for (var i = 0; i < filters.length; i++) {\n   filters[i].setAttribute('aria-pressed', String(filters[i].getAttribute('data-filter') === 'all'));\n  }\n }\n\n function invalidate(root) {\n  var s = state(root);\n  if (!s) return;\n  s.current = null;\n  s.lastRaw = '';\n  s.filter = 'all';\n  s.result.hidden = true;\n  s.empty.hidden = false;\n  s.error.hidden = true;\n  s.input.removeAttribute('aria-invalid');\n  s.announce.textContent = '';\n  s.parts.textContent = '';\n  s.checks.textContent = '';\n  if (s.proposal) s.proposal.value = '';\n  if (s.copyStatus) s.copyStatus.hidden = true;\n  resetFilters(root);\n }\n\n function applyFilter(root, value) {\n  var s = state(root);\n  if (!s) return;\n  s.filter = value;\n  var filters = root.querySelectorAll('.ld-filter');\n  for (var i = 0; i < filters.length; i++) {\n   filters[i].setAttribute('aria-pressed', String(filters[i].getAttribute('data-filter') === value));\n  }\n  var rows = s.checks.querySelectorAll('.ld-check');\n  var shown = 0;\n  for (var j = 0; j < rows.length; j++) {\n   var hide = value === 'all' ? false : rows[j].getAttribute('data-status') !== value;\n   rows[j].hidden = hide;\n   if (!hide) shown++;\n  }\n  var none = root.querySelector('.ld-none');\n  if (none) none.hidden = shown > 0;\n  if (s.current) s.announce.textContent = shown + (shown === 1 ? ' observaci\u00f3n visible.' : ' observaciones visibles.');\n }\n\n function render(root, data, focus) {\n  var s = state(root);\n  if (!s) return;\n  s.current = data;\n  s.result.hidden = false;\n  s.empty.hidden = true;\n\n  var titleEl = root.querySelector('.ld-result-title');\n  var textEl = root.querySelector('.ld-result-text');\n  if (titleEl) titleEl.textContent = data.summary.title;\n  if (textEl) textEl.textContent = data.summary.text;\n\n  var reviews = 0;\n  for (var i = 0; i < data.checks.length; i++) if (data.checks[i].status === 'review') reviews++;\n  var mark = root.querySelector('.ld-result-mark');\n  if (mark) {\n   mark.setAttribute('data-tone', reviews ? 'review' : 'good');\n   mark.textContent = '';\n   mark.appendChild(icon(reviews ? 'review' : 'good'));\n  }\n\n  s.parts.textContent = '';\n  var note = root.querySelector('.ld-part-note');\n  if (note) note.textContent = 'Toca una parte para ver qu\u00e9 representa.';\n  var fragment = document.createDocumentFragment();\n  data.parts.forEach(function (part, index) {\n   var button = create('button', 'ld-part', part.value);\n   button.type = 'button';\n   button.setAttribute('data-part', String(index));\n   button.setAttribute('aria-label', part.label + ': ' + part.value);\n   button.setAttribute('aria-pressed', 'false');\n   fragment.appendChild(button);\n  });\n  s.parts.appendChild(fragment);\n\n  var inferred = root.querySelector('.ld-inferred');\n  if (inferred) {\n   inferred.hidden = !data.assumedProtocol;\n   inferred.textContent = 'Has escrito la direcci\u00f3n sin protocolo. Hemos usado https:\/\/ para interpretarla; no hemos comprobado que funcione con HTTPS.';\n  }\n\n  s.checks.textContent = '';\n  var opened = false;\n  data.checks.forEach(function (check) {\n   var row = create('details', 'ld-check');\n   row.setAttribute('data-status', check.status);\n   var summary = create('summary');\n   var symbol = create('span', 'ld-check-icon');\n   symbol.appendChild(icon(check.status));\n   summary.appendChild(symbol);\n   summary.appendChild(create('span', 'ld-check-name', check.title));\n   summary.appendChild(create('span', 'ld-check-status', LABELS[check.status] || check.status));\n   row.appendChild(summary);\n   row.appendChild(create('p', null, check.text));\n   if (!(opened || check.status !== 'review')) {\n    row.open = true;\n    opened = true;\n   }\n   s.checks.appendChild(row);\n  });\n\n  var mode = currentMode(root);\n  var advice = root.querySelector('.ld-advice');\n  if (advice) advice.setAttribute('data-mode', mode);\n  var adviceTitle = root.querySelector('.ld-advice-title');\n  var adviceText = root.querySelector('.ld-advice-text');\n  if (adviceTitle) adviceTitle.textContent = mode === 'published' ? 'Ya est\u00e1 publicada: primero, valora el cambio.' : 'A\u00fan no est\u00e1 publicada: este es el momento de elegir.';\n  if (adviceText) adviceText.textContent = mode === 'published' ? 'Revisa visitas y enlaces antes de tocarla. Si funciona y solo cambia su aspecto, puede compensar conservarla. Si la modificas, prepara una redirecci\u00f3n 301 y actualiza los enlaces.' : 'Elige una direcci\u00f3n que describa la p\u00e1gina y tenga sentido a largo plazo. Comprueba c\u00f3mo la crear\u00e1 tu gestor antes de publicar.';\n\n  var proposalBox = root.querySelector('.ld-proposal');\n  if (s.copyStatus) s.copyStatus.hidden = true;\n  if (proposalBox) proposalBox.hidden = !data.proposal;\n  if (data.proposal) {\n   if (s.proposal) s.proposal.value = data.proposal.url;\n   var reasons = root.querySelector('.ld-proposal-reasons');\n   if (reasons) reasons.textContent = data.proposal.reasons.join(' ');\n   var caution = root.querySelector('#ld-4101-proposal-caution');\n   if (caution) caution.textContent = data.proposal.caution;\n  } else if (s.proposal) {\n   s.proposal.value = '';\n  }\n\n  applyFilter(root, 'all');\n  s.announce.textContent = 'An\u00e1lisis orientativo listo. ' + reviews + (reviews === 1 ? ' aspecto para revisar.' : ' aspectos para revisar.');\n  if (!(!focus || !titleEl)) {\n   try { titleEl.focus({ preventScroll: true }); } catch (_) { titleEl.focus(); }\n  }\n }\n\n function run(root, focus) {\n  var s = state(root);\n  if (!s) return;\n  var raw = s.input.value;\n  var data;\n  try {\n   data = analyzeUrl(raw, currentMode(root));\n  } catch (err) {\n   window.console?.error?.('[estructura-url]', err);\n   data = errorResult('No se pudo analizar la direcci\u00f3n. Revisa su formato y vuelve a intentarlo.', currentMode(root), false);\n  }\n  if (!data.ok) {\n   invalidate(root);\n   s.error.textContent = data.error;\n   s.error.hidden = false;\n   s.input.setAttribute('aria-invalid', 'true');\n   try { s.input.focus({ preventScroll: true }); } catch (_) { s.input.focus(); }\n   return;\n  }\n  s.error.hidden = true;\n  s.input.removeAttribute('aria-invalid');\n  s.lastRaw = raw;\n  s.filter = 'all';\n  render(root, data, focus);\n }\n\n function copyProposal(root) {\n  var s = state(root);\n  if (!s || !s.proposal || !s.copyStatus) return;\n  var value = s.proposal.value;\n  if (!value) return;\n  var note = s.copyStatus;\n  function show(message) {\n   note.textContent = message;\n   note.hidden = false;\n  }\n  function manual() {\n   try { s.proposal.focus({ preventScroll: true }); } catch (_) { s.proposal.focus(); }\n   try { s.proposal.select(); } catch (_) {}\n   show('Seleccionada. Usa la opci\u00f3n Copiar de tu dispositivo.');\n  }\n  if (!navigator.clipboard || !window.isSecureContext) {\n   manual();\n   return;\n  }\n  navigator.clipboard.writeText(value).then(function () {\n   show('Alternativa copiada.');\n  }).catch(manual);\n }\n\n function selectPart(root, button) {\n  var s = state(root);\n  if (!s || !s.current) return;\n  var index = parseInt(button.getAttribute('data-part'), 10);\n  var part = s.current.parts[index];\n  if (!part) return;\n  var buttons = s.parts.querySelectorAll('button');\n  for (var i = 0; i < buttons.length; i++) {\n   buttons[i].setAttribute('aria-pressed', String(buttons[i] === button));\n  }\n  var note = root.querySelector('.ld-part-note');\n  if (note) note.textContent = partDescription(index, part);\n }\n\n function initRoot(root) {\n  var s = state(root);\n  if (!s) return false;\n  var examples = root.querySelectorAll('[data-example]');\n  for (var i = 0; i < examples.length; i++) examples[i].disabled = false;\n  syncModes(root);\n  root.setAttribute('data-ld-ready', 'true');\n  return true;\n }\n\n function bootstrap() {\n  var roots = document.querySelectorAll('#' + ROOT_ID);\n  var ok = roots.length > 0;\n  for (var i = 0; i < roots.length; i++) {\n   if (!initRoot(roots[i])) ok = false;\n  }\n  return ok;\n }\n\n \/\/ Un solo juego de manejadores para toda la p\u00e1gina: funciona aunque el bloque\n \/\/ se inserte despu\u00e9s de cargar (AJAX, constructores de p\u00e1ginas, popups...).\n document.addEventListener('click', function (event) {\n  var target = event.target;\n  if (target?.nodeType === 3) target = target.parentNode;\n  if (!target || target.nodeType !== 1) return;\n  var root = findRoot(target);\n  if (!root) return;\n  var hit;\n\n  if ((hit = closestClass(target, 'ld-submit', root))) { run(root, true); return; }\n\n  if ((hit = closestClass(target, 'ld-example', root))) {\n   var key = hit.getAttribute('data-example');\n   var s = state(root);\n   if (!(!s || !key || !EXAMPLES[key])) {\n    s.input.value = EXAMPLES[key];\n    run(root, true);\n   }\n   return;\n  }\n\n  if ((hit = closestClass(target, 'ld-filter', root))) { applyFilter(root, hit.getAttribute('data-filter') || 'all'); return; }\n\n  if ((hit = closestClass(target, 'ld-copy', root))) { copyProposal(root); return; }\n\n  if ((hit = closestClass(target, 'ld-part', root))) { selectPart(root, hit); return; }\n\n  if ((hit = closestClass(target, 'ld-reset', root))) {\n   var st = state(root);\n   if (st) {\n    st.input.value = '';\n    invalidate(root);\n    try { st.input.focus({ preventScroll: true }); } catch (_) { st.input.focus(); }\n   }\n   return;\n  }\n }, true);\n\n document.addEventListener('keydown', function (event) {\n  var isEnter = event.key === 'Enter' || event.keyCode === 13;\n  if (!isEnter) return;\n  var target = event.target;\n  if (!target || target.nodeType !== 1 || target.id !== 'ld-4101-url') return;\n  var root = findRoot(target);\n  if (!root) return;\n  event.preventDefault();\n  run(root, true);\n }, true);\n\n document.addEventListener('input', function (event) {\n  var target = event.target;\n  if (!target || target.nodeType !== 1 || target.id !== 'ld-4101-url') return;\n  var root = findRoot(target);\n  if (root) invalidate(root);\n }, true);\n\n document.addEventListener('change', function (event) {\n  var target = event.target;\n  if (!target || target.nodeType !== 1 || target.name !== 'ld-4101-mode') return;\n  var root = findRoot(target);\n  if (!root) return;\n  syncModes(root);\n  var s = state(root);\n  if (!s?.current || s.input.value !== s.lastRaw) return;\n  run(root, false);\n }, true);\n\n \/\/ El script puede acabar en el <head>, en el pie o despu\u00e9s de cargar la p\u00e1gina.\n var attempts = 0;\n function retry() {\n  if (bootstrap()) return;\n  if (attempts++ >= 40) return;\n  window.setTimeout(retry, 250);\n }\n retry();\n if (document.readyState === 'loading') {\n  document.addEventListener('DOMContentLoaded', function () { if (!bootstrap()) retry(); });\n }\n window.addEventListener('load', function () { bootstrap(); });\n window.setTimeout(bootstrap, 1200);\n window.setTimeout(bootstrap, 4000);\n})();\n<\/script>\n<!-- FIN BLOQUE: comprueba-si-tu-url-esta-optimizada-para-seo -->\n\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-como-crear-una-url-optimizada-para-seo\">C\u00f3mo crear una URL optimizada para SEO<\/h2>\n\n\n\n<p>Una buena URL ayuda a las personas a reconocer qu\u00e9 van a encontrar en una p\u00e1gina. No tiene que ser perfecta ni seguir una f\u00f3rmula exacta: basta con que sea <strong>clara, coherente con el contenido y f\u00e1cil de compartir<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-elige-palabras-que-describan-la-pagina\">Elige palabras que describan la p\u00e1gina<\/h3>\n\n\n\n<p>Imagina que tienes una tienda de plantas y vas a publicar una gu\u00eda sobre c\u00f3mo cuidar una monstera. Estas dos direcciones podr\u00edan llevar al mismo art\u00edculo:<\/p>\n\n\n\n<ul>\n<li>Menos clara: <code>tutienda.com\/blog\/articulo-2487<\/code><\/li>\n\n\n\n<li>M\u00e1s descriptiva: <code>tutienda.com\/blog\/cuidados-monstera<\/code><\/li>\n<\/ul>\n\n\n\n<!-- BLOQUE: como-crear-una-url-optimizada-para-seo -->\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@400;500;600;700;800&display=swap');\n#comp-ld-4102, #comp-ld-4102 * { box-sizing: border-box; }\n#comp-ld-4102 {\n  color: inherit;\n  font-family: 'Manrope', \"Segoe UI\", Arial, sans-serif;\n  max-width: 860px;\n  margin: 28px auto;\n  padding: 0;\n}\n#comp-ld-4102 .compare-card {\n  background: #fff;\n  border: 1px solid #e5e7eb;\n  border-radius: 20px;\n  padding: 24px;\n  box-shadow: 0 12px 30px rgba(55,54,61,0.07);\n}\n#comp-ld-4102 .eyebrow {\n  margin: 0 0 7px;\n  color: #006b7d;\n  font-size: 0.72rem;\n  font-weight: 800;\n  letter-spacing: 0.11em;\n  text-transform: uppercase;\n}\n#comp-ld-4102 .title {\n  margin: 0 0 18px;\n  color: #37363d;\n  font-size: 1.18rem;\n  line-height: 1.35;\n  font-weight: 800;\n}\n#comp-ld-4102 .comparison {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) 34px minmax(0, 1fr);\n  align-items: center;\n  gap: 10px;\n}\n#comp-ld-4102 .url-example {\n  min-width: 0;\n  padding: 15px 16px;\n  border: 1px solid #e6e8eb;\n  border-radius: 14px;\n  background: #f8f9fa;\n  transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;\n}\n#comp-ld-4102 .url-example:hover {\n  transform: translateY(-2px);\n  border-color: #00bcdf;\n  box-shadow: 0 8px 20px rgba(0,188,223,0.12);\n}\n#comp-ld-4102 .url-example.after {\n  background: #f2fbfc;\n  border-color: rgba(0,188,223,0.42);\n}\n#comp-ld-4102 .stage-label {\n  display: block;\n  margin-bottom: 7px;\n  color: #595862;\n  font-size: 0.76rem;\n  font-weight: 800;\n  letter-spacing: 0.04em;\n}\n#comp-ld-4102 .after .stage-label { color: #006b7d; }\n#comp-ld-4102 .address {\n  display: block;\n  color: #37363d;\n  font-size: 0.92rem;\n  font-weight: 700;\n  line-height: 1.5;\n  overflow-wrap: anywhere;\n}\n#comp-ld-4102 .connector {\n  color: #b85d16;\n  font-size: 1.45rem;\n  font-weight: 800;\n  text-align: center;\n}\n#comp-ld-4102 .principles {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px 18px;\n  margin: 18px 0 0;\n  padding: 15px 0 0;\n  border-top: 1px solid #e9eaed;\n  list-style: none;\n}\n#comp-ld-4102 .principles li {\n  display: flex;\n  align-items: baseline;\n  gap: 7px;\n  color: #4c4b55;\n  font-size: 0.88rem;\n  line-height: 1.45;\n}\n#comp-ld-4102 .principles li::before {\n  content: '';\n  flex: 0 0 7px;\n  width: 7px;\n  height: 7px;\n  border-radius: 50%;\n  background: #db7424;\n}\n@media (max-width: 620px) {\n  #comp-ld-4102 .compare-card { padding: 20px 18px; }\n  #comp-ld-4102 .comparison { grid-template-columns: 1fr; gap: 8px; }\n  #comp-ld-4102 .connector { transform: rotate(90deg); line-height: 1; }\n  #comp-ld-4102 .principles { display: grid; gap: 7px; }\n}\n@media (prefers-reduced-motion: reduce) {\n  #comp-ld-4102 * { transition: none !important; animation: none !important; }\n}\n<\/style>\n<div id=\"comp-ld-4102\">\n  <div class=\"compare-card\">\n    <div class=\"title\">La direcci\u00f3n puede contar qu\u00e9 hay dentro<\/div>\n    <div class=\"comparison\" aria-label=\"Comparaci\u00f3n de dos URL para la misma gu\u00eda\">\n      <div class=\"url-example\">\n        <span class=\"stage-label\">Menos descriptiva<\/span>\n        <span class=\"address\">tutienda.com\/blog\/articulo-2487<\/span>\n      <\/div>\n      <div class=\"connector\" aria-hidden=\"true\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 12h16m-6-6 6 6-6 6\"\/><\/svg><\/div>\n      <div class=\"url-example after\">\n        <span class=\"stage-label\">M\u00e1s descriptiva<\/span>\n        <span class=\"address\">tutienda.com\/blog\/cuidados-monstera<\/span>\n      <\/div>\n    <\/div>\n    <ul class=\"principles\" aria-label=\"Tres criterios para una URL clara\">\n      <li>Describe el contenido.<\/li>\n      <li>Evita repetir palabras clave.<\/li>\n      <li>Ordena las secciones con sentido.<\/li>\n    <\/ul>\n  <\/div>\n<\/div>\n<!-- FIN BLOQUE: como-crear-una-url-optimizada-para-seo -->\n\n\n\n<p><\/p>\n\n\n\n<p>La segunda permite hacerse una idea del contenido antes de entrar. Tambi\u00e9n incluye de forma natural las palabras que alguien podr\u00eda utilizar para buscar informaci\u00f3n sobre el tema.<\/p>\n\n\n\n<p><strong>No hace falta repetir la palabra clave<\/strong> ni incluir todas sus variantes. Una direcci\u00f3n como <code>tutienda.com\/plantas\/monstera-cuidados-cuidar-monstera<\/code> resulta m\u00e1s dif\u00edcil de leer y no aporta informaci\u00f3n \u00fatil.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@400;500;600;700;800&display=swap');\n#comp-ld-4103, #comp-ld-4103 * { box-sizing: border-box; }\n#comp-ld-4103 {\n  color: inherit;\n  font-family: 'Manrope', \"Segoe UI\", Arial, sans-serif;\n  max-width: 860px;\n  margin: 32px auto;\n  padding: 0;\n}\n#comp-ld-4103 .quote-card {\n  position: relative;\n  overflow: hidden;\n  background: #fff;\n  border: 1px solid #ececf0;\n  border-radius: 18px;\n  padding: 30px 32px 26px;\n  box-shadow: 0 14px 38px rgba(55,54,61,0.09);\n}\n#comp-ld-4103 .quote-card::before {\n  content: '';\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 5px;\n  background: linear-gradient(180deg, #00bcdf 0%, #db7424 100%);\n}\n#comp-ld-4103 .quote-card::after {\n  content: '\\201C';\n  position: absolute;\n  top: -24px;\n  right: 18px;\n  color: rgba(55,54,61,0.07);\n\n  font-size: 8.5rem;\n  font-weight: 700;\n  line-height: 1;\n  pointer-events: none;\n}\n#comp-ld-4103 .source-tag {\n  display: flex;\n  align-items: center;\n  gap: 9px;\n  margin-bottom: 10px;\n  color: #006b7d;\n  font-size: 0.7rem;\n  font-weight: 800;\n  letter-spacing: 0.16em;\n  text-transform: uppercase;\n}\n#comp-ld-4103 .source-tag::before {\n  content: '';\n  width: 10px;\n  height: 10px;\n  border-radius: 50%;\n  background: #00bcdf;\n  box-shadow: 0 0 0 4px rgba(0,188,223,0.14);\n}\n#comp-ld-4103 .source-name {\n  margin-bottom: 14px;\n  color: #37363d;\n  font-size: 1rem;\n  font-weight: 800;\n  letter-spacing: 0.05em;\n}\n#comp-ld-4103 .quote-text {\n  padding: 0; border: 0; background: transparent;\n  position: relative;\n  z-index: 1;\n  max-width: 58ch;\n  margin: 0 0 18px;\n  color: #4c4b55;\n  font-size: 1.08rem;\n  font-style: italic;\n  font-weight: 500;\n  line-height: 1.65;\n}\n#comp-ld-4103 .source-link {\n  position: relative;\n  z-index: 1;\n  display: inline-flex;\n  align-items: center;\n  gap: 7px;\n  padding-bottom: 2px;\n  border-bottom: 1px solid rgba(219,116,36,0.45);\n  color: #a94f12;\n  font-size: 0.88rem;\n  font-weight: 700;\n  text-decoration: none;\n  transition: color 0.2s ease, border-color 0.2s ease, gap 0.2s ease;\n}\n#comp-ld-4103 .source-link svg {\n  width: 15px;\n  height: 15px;\n  transition: transform 0.2s ease;\n}\n#comp-ld-4103 .source-link:hover {\n  gap: 10px;\n  border-bottom-color: #a94f12;\n  color: #813b0c;\n}\n#comp-ld-4103 .source-link:hover svg { transform: translate(1px, -1px); }\n#comp-ld-4103 .source-link:focus-visible {\n  border-radius: 3px;\n  outline: 2px solid #a94f12;\n  outline-offset: 3px;\n}\n@media (max-width: 640px) {\n  #comp-ld-4103 .quote-card { padding: 24px 20px 22px; }\n  #comp-ld-4103 .quote-text {\n  padding: 0; border: 0; background: transparent; font-size: 1rem; }\n}\n@media (prefers-reduced-motion: reduce) {\n  #comp-ld-4103 * { transition: none !important; animation: none !important; }\n}\n<\/style>\n<div id=\"comp-ld-4103\">\n  <div class=\"quote-card\">\n    <div class=\"source-tag\">Fuente oficial<\/div>\n    <div class=\"source-name\">MDN Web Docs \u00b7 Mozilla<\/div>\n    <blockquote class=\"quote-text\">\u201cLas URL sem\u00e1nticas usan palabras con significado propio que cualquiera puede entender, sin importar sus conocimientos t\u00e9cnicos\u201d.<\/blockquote>\n    <a class=\"source-link\" href=\"https:\/\/developer.mozilla.org\/es\/docs\/Learn_web_development\/Howto\/Web_mechanics\/What_is_a_URL\" target=\"_blank\" rel=\"noopener noreferrer\">\n      Fuente: MDN Web Docs, \u00abQu\u00e9 es una URL\u00bb\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><line x1=\"7\" y1=\"17\" x2=\"17\" y2=\"7\"\/><polyline points=\"7 7 17 7 17 17\"\/><\/svg>\n    <\/a>\n  <\/div>\n<\/div>\n<!-- FIN BLOQUE: como-crear-una-url-optimizada-para-seo-cita-mdn -->\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-hazla-facil-de-leer-y-compartir\">Hazla f\u00e1cil de leer y compartir<\/h3>\n\n\n\n<p>Para una p\u00e1gina nueva, intenta que la direcci\u00f3n sea breve sin perder claridad. Separa las palabras con guiones y usa min\u00fasculas para mantener un criterio uniforme en toda la web.<\/p>\n\n\n\n<p>Por ejemplo, <code>tutienda.com\/blog\/como-regar-cactus<\/code> es m\u00e1s c\u00f3moda de leer que <code>tutienda.com\/blog\/comoregarcactus<\/code>.<\/p>\n\n\n\n<p>Tambi\u00e9n puedes evitar detalles que queden anticuados. Si tienes pensado actualizar una gu\u00eda cada a\u00f1o, <code>tutienda.com\/blog\/cuidar-cactus<\/code> puede seguir teniendo sentido aunque cambies su contenido. Si el a\u00f1o es una parte esencial del tema, incluirlo puede ser adecuado.<\/p>\n\n\n\n<p>La parte final de la direcci\u00f3n se conoce como <em>slug<\/em>. Si quieres profundizar en ella, te explicamos <a href=\"https:\/\/www.loading.es\/blog\/que-es-un-slug-y-por-que-es-clave-en-tu-estrategia-seo\/\">qu\u00e9 es un slug<\/a> y c\u00f3mo elegirlo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-organiza-las-direcciones-con-sentido\">Organiza las direcciones con sentido<\/h3>\n\n\n\n<p>Las partes que aparecen entre barras pueden ayudar a organizar una web. Por ejemplo:<\/p>\n\n\n\n<ul>\n<li><code>tutienda.com\/plantas\/interior\/monstera<\/code><\/li>\n\n\n\n<li><code>tutienda.com\/plantas\/exterior\/lavanda<\/code><\/li>\n<\/ul>\n\n\n\n<p>En estos ejemplos, la direcci\u00f3n da una pista de d\u00f3nde encaja cada producto. Una estructura con menos niveles tambi\u00e9n puede funcionar: <code>tutienda.com\/plantas\/monstera<\/code> es igual de f\u00e1cil de entender.<\/p>\n\n\n\n<p>Lo importante es que <strong>la organizaci\u00f3n tenga sentido para tu web<\/strong> y resulte coherente entre p\u00e1ginas parecidas. No necesitas a\u00f1adir categor\u00edas solo para alargar la direcci\u00f3n.<\/p>\n\n\n\n<p>Algunas URL incluyen caracteres como <code>?<\/code> o <code>&amp;<\/code>, por ejemplo, cuando un visitante filtra productos por color. Esos par\u00e1metros pueden ser necesarios para que la web funcione. No los elimines sin comprobar antes para qu\u00e9 sirven.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-cuando-conviene-cambiar-una-url-que-ya-esta-publicada\">\u00bfCu\u00e1ndo conviene cambiar una URL que ya est\u00e1 publicada?<\/h2>\n\n\n\n<p>Una direcci\u00f3n no tiene que ser impecable para funcionar. Si una p\u00e1gina recibe visitas y sus lectores encuentran lo que buscan, <strong>cambiar la URL solo para acortarla o a\u00f1adir una palabra clave puede no compensar<\/strong>.<\/p>\n\n\n\n<p>Por ejemplo, si <code>tutienda.com\/blog\/consejos-para-cuidar-una-monstera<\/code> ya atrae visitas, pasarla a <code>tutienda.com\/blog\/cuidados-monstera<\/code> supone modificar una direcci\u00f3n conocida por buscadores y lectores. La nueva es m\u00e1s corta, pero eso no garantiza una mejora de posicionamiento.<\/p>\n\n\n\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@400;500;600;700;800&display=swap');\n#comp-ld-4104, #comp-ld-4104 * { box-sizing: border-box; }\n#comp-ld-4104 {\n  color: inherit;\n  font-family: 'Manrope', \"Segoe UI\", Arial, sans-serif;\n  max-width: 860px;\n  margin: 32px auto;\n  padding: 24px 26px;\n  overflow: hidden;\n  border: 1px solid rgba(255,255,255,0.12);\n  border-radius: 20px;\n  background: #37363d;\n  box-shadow: 0 14px 34px rgba(55,54,61,0.18);\n}\n#comp-ld-4104 .eyebrow {\n  margin: 0 0 7px;\n  color: #75dff0;\n  font-size: 0.72rem;\n  font-weight: 800;\n  letter-spacing: 0.12em;\n  text-transform: uppercase;\n}\n#comp-ld-4104 .title {\n  margin: 0 0 19px;\n  color: #fff;\n  font-size: 1.18rem;\n  font-weight: 800;\n  line-height: 1.35;\n}\n#comp-ld-4104 .decision-layout {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n  border-top: 1px solid rgba(255,255,255,0.18);\n  border-bottom: 1px solid rgba(255,255,255,0.18);\n}\n#comp-ld-4104 .zone {\n  padding: 16px 20px 17px 0;\n}\n#comp-ld-4104 .zone + .zone {\n  padding-right: 0;\n  padding-left: 22px;\n  border-left: 1px solid rgba(255,255,255,0.18);\n}\n#comp-ld-4104 .zone-label {\n  display: block;\n  margin-bottom: 8px;\n  font-size: 0.76rem;\n  font-weight: 800;\n  letter-spacing: 0.12em;\n}\n#comp-ld-4104 .keep .zone-label { color: #65d6a1; }\n#comp-ld-4104 .review .zone-label { color: #ffad70; }\n#comp-ld-4104 .zone p {\n  margin: 0;\n  color: #f4f4f6;\n  font-size: 0.94rem;\n  line-height: 1.58;\n}\n#comp-ld-4104 .decision-rule {\n  margin: 16px 0 0;\n  color: #fff;\n  font-size: 0.94rem;\n  line-height: 1.55;\n}\n#comp-ld-4104 .decision-rule strong { color: #ffad70; }\n@media (max-width: 620px) {\n  #comp-ld-4104 { padding: 21px 19px; }\n  #comp-ld-4104 .decision-layout { grid-template-columns: 1fr; }\n  #comp-ld-4104 .zone { padding: 15px 0; }\n  #comp-ld-4104 .zone + .zone {\n    padding: 15px 0;\n    border-top: 1px solid rgba(255,255,255,0.18);\n    border-left: 0;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  #comp-ld-4104 * { transition: none !important; animation: none !important; }\n}\n<\/style>\n<div id=\"comp-ld-4104\">\n  <div class=\"title\">\u00bfLa URL actual causa un problema real?<\/div>\n  <div class=\"decision-layout\">\n    <div class=\"zone keep\">\n      <span class=\"zone-label\">CONSERVAR<\/span>\n      <p>La p\u00e1gina recibe visitas o tiene enlaces, y sus lectores encuentran lo que buscan.<\/p>\n    <\/div>\n    <div class=\"zone review\">\n      <span class=\"zone-label\">VALORAR UN CAMBIO<\/span>\n      <p>La direcci\u00f3n confunde, ya no corresponde al contenido o forma parte de una reorganizaci\u00f3n.<\/p>\n    <\/div>\n  <\/div>\n  <p class=\"decision-rule\"><strong>Si solo cambia su aspecto, suele compensar mantenerla.<\/strong> Cambiarla no garantiza una mejora.<\/p>\n<\/div>\n<!-- FIN BLOQUE: cuando-conviene-cambiar-una-url-que-ya-esta-publicada -->\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-casos-en-los-que-puede-tener-sentido\">Casos en los que puede tener sentido<\/h3>\n\n\n\n<p>Hay situaciones en las que s\u00ed merece la pena estudiar el cambio:<\/p>\n\n\n\n<ul>\n<li><strong>La direcci\u00f3n genera confusi\u00f3n.<\/strong> Por ejemplo, contiene el nombre de un producto que la p\u00e1gina ya no trata.<\/li>\n\n\n\n<li><strong>La web se est\u00e1 reorganizando.<\/strong> Quiz\u00e1 has unido varias secciones o has trasladado un contenido a otra categor\u00eda.<\/li>\n\n\n\n<li><strong>La URL expone datos que no deber\u00edan ser p\u00fablicos.<\/strong> En este caso, cambiar la direcci\u00f3n puede no ser suficiente: revisa tambi\u00e9n el acceso al contenido y busca ayuda t\u00e9cnica si la necesitas.<\/li>\n\n\n\n<li><strong>La p\u00e1gina acaba de publicarse<\/strong> y has detectado un error importante en la direcci\u00f3n. Aun as\u00ed, prepara una redirecci\u00f3n por si alguien ya la ha visitado o compartido.<\/li>\n<\/ul>\n\n\n\n<p>Cambiar de dominio o rehacer una web completa tambi\u00e9n puede obligarte a modificar direcciones, pero son cambios m\u00e1s amplios que conviene planificar con cuidado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-que-revisar-antes-de-decidir\">Qu\u00e9 revisar antes de decidir<\/h3>\n\n\n\n<p>Antes de tocar una URL, anota la direcci\u00f3n actual y preg\u00fantate:<\/p>\n\n\n\n<ul>\n<li><strong>\u00bfRecibe visitas desde Google?<\/strong> Si tienes Search Console, consulta los clics y las impresiones de esa p\u00e1gina durante los \u00faltimos meses. Compara un periodo suficiente para tu negocio: algunas p\u00e1ginas reciben visitas sobre todo en determinadas \u00e9pocas.<\/li>\n\n\n\n<li><strong>\u00bfHay enlaces que apuntan a ella?<\/strong> Revisa los enlaces de tu propia web y, si puedes, los de otras p\u00e1ginas. Tambi\u00e9n puede estar en redes sociales, anuncios o correos enviados a tus clientes.<\/li>\n\n\n\n<li><strong>\u00bfQu\u00e9 problema concreto voy a resolver?<\/strong> Una direcci\u00f3n poco elegante no siempre causa un problema real. En ocasiones, mejorar el contenido o facilitar la navegaci\u00f3n puede ser m\u00e1s \u00fatil.<\/li>\n\n\n\n<li><strong>\u00bfPuedo preparar el cambio?<\/strong> Necesitar\u00e1s que la direcci\u00f3n antigua lleve a la nueva y comprobar despu\u00e9s que todo funciona.<\/li>\n<\/ul>\n\n\n\n<p>Si la p\u00e1gina ya tiene buenos resultados y el \u00fanico motivo es mejorar su aspecto, <strong>mantenerla suele ser la opci\u00f3n m\u00e1s prudente<\/strong>. Y si no tienes datos suficientes, eso no significa que nadie la visite o la tenga guardada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-como-cambiar-una-url-sin-perder-posicionamiento\">C\u00f3mo cambiar una URL sin perder posicionamiento<\/h2>\n\n\n\n<p>Si has decidido cambiar una direcci\u00f3n, puedes reducir el riesgo preparando el traslado. Aun haciendo todo bien, <strong>no se puede garantizar que el posicionamiento permanezca igual<\/strong>: Google necesita tiempo para descubrir el cambio y puede haber variaciones temporales.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-prepara-la-nueva-direccion-y-una-redireccion-301\">Prepara la nueva direcci\u00f3n y una redirecci\u00f3n 301<\/h3>\n\n\n\n<p>Una <strong><a href=\"https:\/\/www.loading.es\/blog\/como-hacer-una-redireccion-301-desde-htaccess\/\">redirecci\u00f3n 301<\/a><\/strong> indica que la p\u00e1gina se ha trasladado de forma permanente. Cuando alguien visita la direcci\u00f3n antigua, llega a la nueva sin tener que buscarla de nuevo. Tambi\u00e9n ayuda a los buscadores a entender el traslado.<\/p>\n\n\n\n<p>Por ejemplo:<\/p>\n\n\n\n<p><code>tutienda.com\/blog\/guia-antigua<\/code> \u2192 <code>tutienda.com\/blog\/cuidados-monstera<\/code><\/p>\n\n\n\n<p>La nueva p\u00e1gina debe ofrecer el mismo contenido o uno que lo sustituya de forma relevante. <strong>No env\u00edes todas las direcciones antiguas a la p\u00e1gina de inicio<\/strong>: quien busque una gu\u00eda concreta espera llegar a esa gu\u00eda, no empezar de nuevo.<\/p>\n\n\n\n<p>Procura que la direcci\u00f3n antigua lleve directamente a la definitiva, sin pasar por varias redirecciones. Y mant\u00e9n la redirecci\u00f3n activa: otras webs, marcadores o mensajes antiguos pueden seguir utilizando la direcci\u00f3n anterior durante mucho tiempo.<\/p>\n\n\n\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@400;500;600;700;800&display=swap');\n#comp-ld-4105, #comp-ld-4105 * { box-sizing: border-box; }\n#comp-ld-4105 {\n  color: inherit;\n  font-family: 'Manrope', \"Segoe UI\", Arial, sans-serif;\n  max-width: 860px;\n  margin: 32px auto;\n  padding: 0;\n}\n#comp-ld-4105 .check-card {\n  padding: 24px;\n  border: 1px solid #e5e7eb;\n  border-radius: 20px;\n  background: #f4f4f6;\n  box-shadow: 0 12px 30px rgba(55,54,61,0.07);\n}\n#comp-ld-4105 .eyebrow {\n  margin: 0 0 7px;\n  color: #006b7d;\n  font-size: 0.72rem;\n  font-weight: 800;\n  letter-spacing: 0.11em;\n  text-transform: uppercase;\n}\n#comp-ld-4105 .title {\n  margin: 0 0 18px;\n  color: #37363d;\n  font-size: 1.18rem;\n  font-weight: 800;\n  line-height: 1.35;\n}\n#comp-ld-4105 .progress-head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  margin-bottom: 8px;\n}\n#comp-ld-4105 .progress-label,\n#comp-ld-4105 .progress-status {\n  color: #4c4b55;\n  font-size: 0.82rem;\n  font-weight: 700;\n}\n#comp-ld-4105 .progress-status { color: #006b7d; }\n#comp-ld-4105 .progress-bar {\n  display: block;\n  width: 100%;\n  height: 10px;\n  margin: 0 0 17px;\n  overflow: hidden;\n  border: 0;\n  border-radius: 999px;\n  background: #e0e3e6;\n  color: #198754;\n  appearance: none;\n}\n#comp-ld-4105 .progress-bar::-webkit-progress-bar {\n  border-radius: 999px;\n  background: #e0e3e6;\n}\n#comp-ld-4105 .progress-bar::-webkit-progress-value {\n  border-radius: 999px;\n  background: #198754;\n  transition: width 0.22s ease;\n}\n#comp-ld-4105 .progress-bar::-moz-progress-bar {\n  border-radius: 999px;\n  background: #198754;\n  transition: width 0.22s ease;\n}\n#comp-ld-4105 .checklist {\n  display: grid;\n  gap: 0;\n}\n#comp-ld-4105 .task {\n  display: grid;\n  grid-template-columns: 22px minmax(0, 1fr);\n  gap: 11px;\n  padding: 13px 10px;\n  border-top: 1px solid #e2e4e7;\n  border-radius: 10px;\n  transition: background 0.18s ease;\n}\n#comp-ld-4105 .task:hover { background: rgba(0,188,223,0.07); }\n#comp-ld-4105 .task input {\n  width: 18px;\n  height: 18px;\n  margin: 2px 0 0;\n  accent-color: #198754;\n  cursor: pointer;\n}\n#comp-ld-4105 .task input:focus-visible {\n  outline: 2px solid #006b7d;\n  outline-offset: 3px;\n}\n#comp-ld-4105 .task-copy {\n  display: grid;\n  gap: 3px;\n  cursor: pointer;\n}\n#comp-ld-4105 .task-title {\n  color: #37363d;\n  font-size: 0.94rem;\n  font-weight: 800;\n  line-height: 1.4;\n}\n#comp-ld-4105 .task-note {\n  color: #595862;\n  font-size: 0.86rem;\n  line-height: 1.45;\n}\n@media (max-width: 620px) {\n  #comp-ld-4105 .check-card { padding: 20px 18px; }\n  #comp-ld-4105 .progress-head { align-items: flex-start; flex-direction: column; gap: 4px; }\n  #comp-ld-4105 .task { padding: 12px 4px; }\n}\n@media (prefers-reduced-motion: reduce) {\n  #comp-ld-4105 * { transition: none !important; animation: none !important; }\n}\n<\/style>\n<div id=\"comp-ld-4105\">\n  <div class=\"check-card\">\n    <div class=\"title\">Antes de dar por hecho el cambio<\/div>\n    <div class=\"progress-head\">\n      <span class=\"progress-label\">Tareas marcadas<\/span>\n      <span class=\"progress-status\" id=\"comp-ld-4105-status\" aria-live=\"polite\">0 de 4 tareas marcadas<\/span>\n    <\/div>\n    <progress class=\"progress-bar\" id=\"comp-ld-4105-progress\" max=\"4\" value=\"0\" aria-label=\"Tareas marcadas\" aria-valuetext=\"0 de 4 tareas marcadas\">0 de 4<\/progress>\n    <div class=\"checklist\" role=\"group\" aria-label=\"Pasos para cambiar una URL\">\n      <label class=\"task\" for=\"comp-ld-4105-task-1\">\n        <input id=\"comp-ld-4105-task-1\" type=\"checkbox\">\n        <span class=\"task-copy\">\n          <span class=\"task-title\">Prepara el destino y la redirecci\u00f3n 301<\/span>\n          <span class=\"task-note\">Elige la URL final y configura que la antigua lleve directamente a ella.<\/span>\n        <\/span>\n      <\/label>\n      <label class=\"task\" for=\"comp-ld-4105-task-2\">\n        <input id=\"comp-ld-4105-task-2\" type=\"checkbox\">\n        <span class=\"task-copy\">\n          <span class=\"task-title\">Actualiza los enlaces y el sitemap<\/span>\n          <span class=\"task-note\">Cambia los enlaces internos que puedas editar y comprueba que el mapa del sitio incluye la nueva URL.<\/span>\n        <\/span>\n      <\/label>\n      <label class=\"task\" for=\"comp-ld-4105-task-3\">\n        <input id=\"comp-ld-4105-task-3\" type=\"checkbox\">\n        <span class=\"task-copy\">\n          <span class=\"task-title\">Comprueba ambas URL<\/span>\n          <span class=\"task-note\">Abre la direcci\u00f3n antigua y la nueva; confirma la redirecci\u00f3n y el contenido de destino.<\/span>\n        <\/span>\n      <\/label>\n      <label class=\"task\" for=\"comp-ld-4105-task-4\">\n        <input id=\"comp-ld-4105-task-4\" type=\"checkbox\">\n        <span class=\"task-copy\">\n          <span class=\"task-title\">Haz seguimiento en Search Console<\/span>\n          <span class=\"task-note\">Inspecciona la URL nueva y observa clics e impresiones durante las semanas siguientes.<\/span>\n        <\/span>\n      <\/label>\n    <\/div>\n  <\/div>\n<\/div>\n<script>\n(function () {\n  var blockId = 'comp-ld-4105';\n  function initChecklist() {\n    var root = document.getElementById(blockId);\n    if (!root || root.getAttribute('data-ld-ready') === 'true') return;\n    root.setAttribute('data-ld-ready', 'true');\n    var checks = Array.prototype.slice.call(root.querySelectorAll('input[type=\"checkbox\"]'));\n    var progress = root.querySelector('#comp-ld-4105-progress');\n    var status = root.querySelector('#comp-ld-4105-status');\n    if (!progress || !status || checks.length === 0) return;\n    function updateProgress() {\n      var marked = checks.filter(function (check) { return check.checked; }).length;\n      var message = marked + ' de ' + checks.length + ' tareas marcadas';\n      progress.value = marked;\n      progress.setAttribute('aria-valuetext', message);\n      status.textContent = message;\n    }\n    checks.forEach(function (check) { check.addEventListener('change', updateProgress); });\n    updateProgress();\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initChecklist, { once: true });\n  } else {\n    initChecklist();\n  }\n})();\n<\/script>\n<!-- FIN BLOQUE: como-cambiar-una-url-sin-perder-posicionamiento -->\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-cambia-la-direccion-en-wordpress\">Cambia la direcci\u00f3n en WordPress<\/h3>\n\n\n\n<p>Si utilizas WordPress, puedes editar la parte final de la URL desde los ajustes de la entrada o p\u00e1gina. El nombre y la ubicaci\u00f3n de la opci\u00f3n pueden variar seg\u00fan el editor y la versi\u00f3n que uses.<\/p>\n\n\n\n<p>Antes de guardar, apunta la direcci\u00f3n antigua y decide cu\u00e1l ser\u00e1 la nueva. <strong>Comprueba c\u00f3mo vas a crear la redirecci\u00f3n 301<\/strong>: puedes usar un plugin de redirecciones o pedir ayuda a tu proveedor de hosting. No des por hecho que WordPress o un plugin la habr\u00e1n creado correctamente.<\/p>\n\n\n\n<p>Despu\u00e9s de guardar el cambio, abre la direcci\u00f3n antigua en una ventana de inc\u00f3gnito y verifica que llega a la p\u00e1gina nueva. Si tienes dudas o vas a cambiar muchas URL, pide ayuda antes de modificar la estructura general de enlaces permanentes: puede afectar a numerosas p\u00e1ginas a la vez.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-actualiza-los-enlaces-y-comprueba-el-resultado\">Actualiza los enlaces y comprueba el resultado<\/h3>\n\n\n\n<p>Aunque la redirecci\u00f3n funcione, actualiza los enlaces de tu web para que apunten directamente a la nueva direcci\u00f3n. Revisa tambi\u00e9n los men\u00fas y los lugares que puedas editar, como tus perfiles sociales o campa\u00f1as activas.<\/p>\n\n\n\n<p>Una vez hecho el cambio:<\/p>\n\n\n\n<ol>\n<li><strong>Abre las dos direcciones.<\/strong> La antigua debe llevar a la nueva y esta debe mostrar el contenido correcto.<\/li>\n\n\n\n<li><strong>Revisa el mapa del sitio<\/strong>, si utilizas uno: deber\u00eda incluir la nueva URL. Si tu plugin lo actualiza autom\u00e1ticamente, comprueba que lo ha hecho.<\/li>\n\n\n\n<li><strong>Usa la inspecci\u00f3n de URL de Search Console<\/strong> para revisar la direcci\u00f3n nueva y, si lo necesitas, solicitar que Google la rastree. La solicitud no garantiza una indexaci\u00f3n inmediata.<\/li>\n\n\n\n<li><strong>Observa los clics y las impresiones<\/strong> durante las semanas siguientes. Es normal que Google tarde un tiempo en procesar el cambio, as\u00ed que valora la evoluci\u00f3n con perspectiva.<\/li>\n<\/ol>\n\n\n\n<p>Si gestionas tu sitio con WordPress, contar con un <a href=\"https:\/\/www.loading.es\/hosting-wordpress\/index.html\">hosting WordPress<\/a> y soporte al que puedas acudir facilita resolver dudas cuando necesitas hacer cambios en la web.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-conclusion\">Conclusi\u00f3n<\/h2>\n\n\n\n<p>Cuando crees una p\u00e1gina, dedica un momento a elegir una URL clara y relacionada con su contenido. Es m\u00e1s f\u00e1cil empezar con una direcci\u00f3n \u00fatil que tener que modificarla despu\u00e9s.<\/p>\n\n\n\n<p>Si la p\u00e1gina ya est\u00e1 publicada, revisa sus visitas y enlaces antes de decidir. Y si necesitas cambiarla, prepara una redirecci\u00f3n 301, actualiza los enlaces y comprueba que la nueva direcci\u00f3n funciona. <strong>La mejor decisi\u00f3n es la que mejora tu web sin asumir cambios innecesarios.<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.loading.es\/hosting\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" loading=\"lazy\" width=\"1000\" height=\"100\" src=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb.png\" alt=\"oferta para contratar hosting web\" class=\"wp-image-8039\" srcset=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb.png 1000w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-300x30.png 300w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-768x77.png 768w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-850x85.png 850w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/a><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-preguntas-frecuentes-sobre-los-crm-open-source-faq\">Preguntas frecuentes sobre optimizar las URLs para mejorar el SEO (FAQ)<\/h2>\n\n\n\n<style>\n#comp-ld-4106, #comp-ld-4106 * { box-sizing: border-box; }\n#comp-ld-4106 {\n  color: inherit;\n  font-family: inherit;\n  max-width: 860px;\n  margin: 24px auto;\n  padding: 0;\n  background: transparent;\n}\n#comp-ld-4106 details {\n  border-bottom: 1px solid rgba(55,54,61,0.1);\n}\n#comp-ld-4106 summary {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  padding: 16px 2px;\n  color: #37363d;\n  font-family: inherit;\n  font-size: 1rem;\n  font-weight: 700;\n  line-height: 1.5;\n  list-style: none;\n  cursor: pointer;\n  transition: color 0.18s ease;\n}\n#comp-ld-4106 summary::-webkit-details-marker { display: none; }\n#comp-ld-4106 summary::after {\n  content: '+';\n  display: inline-flex;\n  flex: 0 0 28px;\n  width: 28px;\n  height: 28px;\n  align-items: center;\n  justify-content: center;\n  border-radius: 50%;\n  background: rgba(219,116,36,0.1);\n  color: #a94f12;\n  font-size: 1.1rem;\n  font-weight: 700;\n  line-height: 1;\n}\n#comp-ld-4106 details[open] > summary::after { content: '\u2212'; }\n#comp-ld-4106 summary:hover { color: #a94f12; }\n#comp-ld-4106 summary:focus-visible {\n  border-radius: 4px;\n  outline: 2px solid #a94f12;\n  outline-offset: 3px;\n}\n#comp-ld-4106 .answer {\n  margin: 0;\n  padding: 0 46px 17px 2px;\n  color: #4c4b55;\n  font-family: inherit;\n  font-size: 0.96rem;\n  line-height: 1.6;\n}\n@media (max-width: 620px) {\n  #comp-ld-4106 summary { padding: 14px 2px; }\n  #comp-ld-4106 .answer { padding-right: 10px; }\n}\n@media (prefers-reduced-motion: reduce) {\n  #comp-ld-4106 * { transition: none !important; animation: none !important; }\n}\n<\/style>\n<div id=\"comp-ld-4106\">\n  <details>\n    <summary>\u00bfUna URL corta posiciona mejor en Google?<\/summary>\n    <p class=\"answer\">Una URL corta puede ser m\u00e1s f\u00e1cil de leer y compartir, pero su longitud por s\u00ed sola no garantiza mejores posiciones. Lo importante es que sea clara y describa la p\u00e1gina.<\/p>\n  <\/details>\n  <details>\n    <summary>\u00bfDebo incluir la palabra clave en la URL?<\/summary>\n    <p class=\"answer\">Puedes incluirla si describe el contenido y encaja de forma natural. No hace falta repetirla ni cambiar una direcci\u00f3n que ya funciona solo para a\u00f1adirla.<\/p>\n  <\/details>\n  <details>\n    <summary>\u00bfPuedo cambiar la URL de una p\u00e1gina de WordPress?<\/summary>\n    <p class=\"answer\">S\u00ed. Puedes editarla desde los ajustes de la p\u00e1gina o entrada. Si ya estaba publicada, prepara una redirecci\u00f3n 301 y comprueba que la direcci\u00f3n antigua lleva a la nueva.<\/p>\n  <\/details>\n  <details>\n    <summary>\u00bfQu\u00e9 pasa si cambio una URL sin redirigirla?<\/summary>\n    <p class=\"answer\">Quienes usen la direcci\u00f3n antigua pueden encontrarse con una p\u00e1gina de error. Adem\u00e1s, los buscadores tendr\u00e1n m\u00e1s dificultades para relacionar la direcci\u00f3n anterior con la nueva.<\/p>\n  <\/details>\n  <details>\n    <summary>\u00bfCu\u00e1nto tiempo debo mantener una redirecci\u00f3n 301?<\/summary>\n    <p class=\"answer\">Siempre que puedas, mantenla de forma indefinida. As\u00ed los enlaces antiguos y los marcadores de tus visitantes seguir\u00e1n funcionando.<\/p>\n  <\/details>\n  <details>\n    <summary>\u00bfTengo que cambiar todas mis URL para mejorar el SEO?<\/summary>\n    <p class=\"answer\">No. Si tus p\u00e1ginas funcionan y sus direcciones no causan problemas, puedes mantenerlas. Aplica las mejoras al crear p\u00e1ginas nuevas y valora cada cambio por separado.<\/p>\n  <\/details>\n<\/div>\n<!-- FIN BLOQUE: preguntas-frecuentes-sobre-las-url-y-el-seo -->\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-4 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-el-blog-de-loading wp-block-embed-el-blog-de-loading\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"L2NzouVniA\"><a href=\"https:\/\/www.loading.es\/blog\/guia-marketing-de-afiliados\/\">Gu\u00eda sobre marketing de afiliados y programas para empezar<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abGu\u00eda sobre marketing de afiliados y programas para empezar\u00bb \u2014 El blog de Loading\" src=\"https:\/\/www.loading.es\/blog\/guia-marketing-de-afiliados\/embed\/#?secret=feOAcSNTll#?secret=L2NzouVniA\" data-secret=\"L2NzouVniA\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-el-blog-de-loading wp-block-embed-el-blog-de-loading\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"nNTdHvLObw\"><a href=\"https:\/\/www.loading.es\/blog\/comparativa-entre-woocommerce-y-shopify-para-tiendas-online\/\">Comparativa entre WooCommerce y Shopify para tiendas online<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abComparativa entre WooCommerce y Shopify para tiendas online\u00bb \u2014 El blog de Loading\" src=\"https:\/\/www.loading.es\/blog\/comparativa-entre-woocommerce-y-shopify-para-tiendas-online\/embed\/#?secret=g6NtJRGdKX#?secret=nNTdHvLObw\" data-secret=\"nNTdHvLObw\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-el-blog-de-loading wp-block-embed-el-blog-de-loading\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"B9gIp3avfB\"><a href=\"https:\/\/www.loading.es\/blog\/mejores-plugins-afiliados-amazon-wordpress\/\">Los mejores plugins de afiliados de Amazon para WordPress<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abLos mejores plugins de afiliados de Amazon para WordPress\u00bb \u2014 El blog de Loading\" src=\"https:\/\/www.loading.es\/blog\/mejores-plugins-afiliados-amazon-wordpress\/embed\/#?secret=kw0KLOccQZ#?secret=B9gIp3avfB\" data-secret=\"B9gIp3avfB\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n<\/div>\n<\/div>\n\n\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"\u00bfUna URL corta posiciona mejor en Google?\",\n      \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"Una URL corta puede ser m\u00e1s f\u00e1cil de leer y compartir, pero su longitud por s\u00ed sola no garantiza mejores posiciones. Lo importante es que sea clara y describa la p\u00e1gina.\" }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"\u00bfDebo incluir la palabra clave en la URL?\",\n      \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"Puedes incluirla si describe el contenido y encaja de forma natural. No hace falta repetirla ni cambiar una direcci\u00f3n que ya funciona solo para a\u00f1adirla.\" }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"\u00bfPuedo cambiar la URL de una p\u00e1gina de WordPress?\",\n      \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"S\u00ed. Puedes editarla desde los ajustes de la p\u00e1gina o entrada. Si ya estaba publicada, prepara una redirecci\u00f3n 301 y comprueba que la direcci\u00f3n antigua lleva a la nueva.\" }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"\u00bfQu\u00e9 pasa si cambio una URL sin redirigirla?\",\n      \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"Quienes usen la direcci\u00f3n antigua pueden encontrarse con una p\u00e1gina de error. Adem\u00e1s, los buscadores tendr\u00e1n m\u00e1s dificultades para relacionar la direcci\u00f3n anterior con la nueva.\" }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"\u00bfCu\u00e1nto tiempo debo mantener una redirecci\u00f3n 301?\",\n      \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"Siempre que puedas, mantenla de forma indefinida. As\u00ed los enlaces antiguos y los marcadores de tus visitantes seguir\u00e1n funcionando.\" }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"\u00bfTengo que cambiar todas mis URL para mejorar el SEO?\",\n      \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"No. Si tus p\u00e1ginas funcionan y sus direcciones no causan problemas, puedes mantenerlas. Aplica las mejoras al crear p\u00e1ginas nuevas y valora cada cambio por separado.\" }\n    }\n  ]\n}\n<\/script>\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"WebApplication\",\n  \"name\": \"Analizador de URL para SEO\",\n  \"description\": \"Herramienta gratuita para analizar la estructura de una URL, detectar posibles aspectos mejorables y obtener recomendaciones orientativas de SEO.\",\n  \"url\": \"https:\/\/www.loading.es\/blog\/optimizar-url-web-mejorar-seo\/\",\n  \"applicationCategory\": \"UtilitiesApplication\",\n  \"operatingSystem\": \"Any\",\n  \"browserRequirements\": \"Navegador con JavaScript habilitado\",\n  \"inLanguage\": \"es-ES\",\n  \"isAccessibleForFree\": true,\n  \"offers\": {\n    \"@type\": \"Offer\",\n    \"price\": \"0\",\n    \"priceCurrency\": \"EUR\"\n  }\n}\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Optimizar las URL para SEO puede ayudarte a tener una web m\u00e1s clara y f\u00e1cil de entender. Pero antes de cambiar una direcci\u00f3n, hay una pregunta m\u00e1s importante: \u00bfrealmente merece la pena modificarla?<\/p>\n<p>Si est\u00e1s creando una p\u00e1gina, tienes la oportunidad de elegir una URL sencilla desde el principio. Si ya est\u00e1 publicada y recibe visitas, quiz\u00e1 lo mejor sea dejarla como est\u00e1. Vamos a ver c\u00f3mo tomar esa decisi\u00f3n y qu\u00e9 hacer si necesitas cambiarla.<\/p>\n","protected":false},"author":2,"featured_media":11762,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35],"tags":[326],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/posts\/11761"}],"collection":[{"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/comments?post=11761"}],"version-history":[{"count":10,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/posts\/11761\/revisions"}],"predecessor-version":[{"id":11773,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/posts\/11761\/revisions\/11773"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/media\/11762"}],"wp:attachment":[{"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/media?parent=11761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/categories?post=11761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/tags?post=11761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}