urlmanager pretty parameter link example php redirect yii2 yii2-advanced-app canonical-link

php - pretty - yii2 request



Yii 2 URL canónica en la configuración de urlManager (3)

Creo que tendrá problemas al crear la URL de la aplicación a "article / a".

¿Por qué no usar htaccess o el archivo vhost para hacer una redirección 302 a la URL correcta?

Si quieres manejarlo a través de urlManager, creo que puedes registrar el enlace canónico

$this->registerLinkTag([''rel'' => ''canonical'', ''href'' => ''article/a'']);

en la vista. Detalles del modo aquí: http://www.yiiframework.com/doc-2.0/yii-helpers-baseurl.html#canonical()-detail

Tengo la sección urlManager en la configuración de la aplicación con varias URL por ruta:

''urlManager'' => [ ''enablePrettyUrl'' => true, ''showScriptName'' => false, ''enableStrictParsing'' => true, ''rules'' => [ ''article-a'' => ''article/a'', // canonic comes first ''article-deprecated-a'' => ''article/a'', ''article-another-a-is-deprecated'' => ''article/a'', ''b-annoucement'' => ''announcement/b'', // canonic comes first ''legacy-b-annoncement'' => ''announcement/b'', ...

Las URL de SEF para las rutas se almacenan en frontend/config/main.php como una matriz, con múltiples URL por ruta. La primera URL para la ruta dada (es decir, /article-a ) es canónica y el resto son URL heredadas.

¿Cuál es la forma más natural de especificar URL canónica para un grupo de URL que apuntan a la misma ruta? Puede ser rel="canonical" a la vista o 301/302 redirigir a la URL canónica.

Las URL canónicas se deben especificar preferiblemente en un lugar donde se definieron las rutas (archivo de configuración frontend/config/main.php en este caso). El requisito aquí es que la URL canónica debe definirse fuera del controlador, no codificada de forma rígida para el controlador.


Yii2 proporciona una herramienta para generar URL canónicas basadas en tus reglas.

/helpers/Url::canonical()

La idea es que le proporcionará una URL para ''artículo-a''.


No estoy seguro de cómo exactamente necesita administrar sus reglas, así que buscaré un caso de uso general y basaré mi respuesta en lo que entendí del Artículo de Paddy Moogan, que resumiré en el siguiente ejemplo y espero ayuda a diseñar su solución requerida:

requisito:

Asumir que un motor de búsqueda envió un robot para verificar la page B en mi sitio web y no estoy de acuerdo con que las personas lleguen a la page B lugar de a la page A Así que así es como puedo aclarar mi punto al robot :

  1. Forzar una redirección 301 a la page A :

    Diciéndole al motor de búsqueda que esta página se traslada permanentemente a la página A. Por lo tanto, no envíe más personas a ella. Envíelos a la página A en su lugar.

  2. Forzar una redirección 302 a la page A :

    Indicando al motor de búsqueda que esta página se transfirió temporalmente a la página A. Haga lo que crea que sea apropiado.

  3. Apertura de la page B ( código de estado 200 ) pero inserte un elemento de enlace canónico que apunta a la page A :

    Le digo al motor de búsqueda que esta página funciona bien, pero para mí es una página secundaria y sugeriría enviar a los siguientes visitantes a la página A en su lugar.

diseño:

Entonces, de acuerdo con esto, así es como vería una estructura posible en la configuración de mis reglas:

''rules'' => [ [ // by default: ''class'' => ''yii/web/UrlRule'', ''pattern'' => ''/'', ''route'' => ''site/index'', ], [ // the custom class ''class'' => ''app/components/SEOUrlRule'', ''pattern'' => ''about'', ''route'' => ''site/about'', ''permanents'' => [ ''deprecated-about'', ''an-older-deprecated-about'' ], ''temporaries'' => [ ''under-construction-about'', ], ''secondaries'' => [ ''about-page-2'' ] ], [ // different route with own action but canonical should be injected ''class'' => ''app/components/SEOUrlRule'', ''pattern'' => ''experimental-about'', ''route'' => ''whatever/experimental'', ''canonical'' => ''about'' ], ]

De esta forma puedo encadenar tantas matrices como necesite para usar la clase predeterminada Yii / web / UrlRule de Yii, mientras que puedo tener una personalizada en la carpeta de componentes de mi aplicación dedicada a los controladores relacionados con SEO.

Antes de ir al código, así es como espero que se comporte mi sitio web:

  • Visita la página / acerca de la que obtiene una respuesta de 200 (no se agrega canónico).
  • Visita la página / deprecated-about a la que se redirecciona a / acerca del código de estado 301 .
  • Visita la página / under-construction-about a la que se redirecciona con el código de estado 302 .
  • Cuando visita la página / about-page-2 obtiene una respuesta 200 ( representada por index/about action ). No se inyectan automáticamente en el código fuente redirecciones, excepto una etiqueta similar: <link href="http://my-website/about" rel="canonical">
  • Usted visita la página / experimental-about obtiene una respuesta de 200 ( representada por su propia acción whatever/experimental ) pero con la misma etiqueta canónica arriba inyectada.

código:

El SEOUrlRule simplemente ampliará / yii / web / UrlRule y anulará su método parseRequest para definir los atributos adicionales en función de los cuales parent::parseRequest() una redirección HTTP o llamaremos a parent::parseRequest() después de registrar la etiqueta de enlace canónico en Yii::$app->view :

namespace app/components; use Yii; class SEOUrlRule extends /yii/web/UrlRule { public $permanents = []; public $temporaries = []; public $secondaries = []; public $canonical = null; public function parseRequest($manager, $request) { $pathInfo = $request->getPathInfo(); if(in_array($pathInfo, $this->permanents)) { $request->setPathInfo($this->name); Yii::$app->response->redirect($this->name, 301); } else if(in_array($pathInfo, $this->temporaries)) { $request->setPathInfo($this->name); Yii::$app->response->redirect($this->name, 302); } else if($this->canonical or in_array($pathInfo, $this->secondaries)) { $route = $this->name; if ($this->canonical === null) $request->setPathInfo($route); else $route = $this->canonical; Yii::$app->view->registerLinkTag([ ''rel'' => ''canonical'', ''href'' => Yii::$app->urlManager->createAbsoluteUrl($route) ]); } return parent::parseRequest($manager, $request); } }

Y eso es todo lo que necesita. Tenga en cuenta que Yii::$app->controller o sus acciones relacionadas aún no estarán disponibles en esta etapa temprana de resolución de rutas como se muestra en este diagrama de ciclo de vida, pero parece que Yii::$app->view ya está inicializado y puede usar su propiedad $ params para establecer parámetros personalizados ( como se hace en este ejemplo ) que puede ser útil para casos más advenidos en los que se deben compartir más datos o rellenarlos en el resultado final.