gpt4 book ai didi

php - urlManager 配置中的 Yii 2 规范 URL

转载 作者:可可西里 更新时间:2023-10-31 23:11:35 27 4
gpt4 key购买 nike

我在应用程序配置中有 urlManager 部分,每个路由有多个 URL:

    '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',
...

路由的 SEF URL 作为数组存储在 frontend/config/main.php 中,每个路由有多个 URL。给定路由的第一个 URL(即 /article-a)是规范的,其余是旧版 URL。

为指向同一路由的一组 URL 指定规范 URL 的最自然方法是什么?它可以是 View 中的 rel="canonical" 或 301/302 重定向到规范 URL。

规范 URL 最好在定义路由的地方指定(在本例中为 frontend/config/main.php 配置文件)。 这里的要求是规范 URL 应该在 Controller 之外定义,而不是硬编码到 Controller 。

最佳答案

我不确定您究竟需要如何管理您的规则,所以我将针对一般用例,并根据我从 Paddy Moogan's Article 中理解的内容做出回答。我将在下面的示例中恢复,希望它有助于设计您所需的解决方案:

要求:

假设搜索引擎确实发送了一个机器人来检查page B在我的网站上,我不喜欢人们访问 page B而不是 page A .所以这就是我如何向机器人阐明我的观点:

  1. 强制 301重定向到 page A :

    告诉搜索引擎此页面已永久移至页面 A。因此请不要向其发送更多人。而是将它们发送到页面 A。

  2. 强制 302重定向到 page A :

    告诉搜索引擎此页面临时已移至页面 A。所以随心所欲是合适的。

  3. 开幕 page B (200 状态代码)但插入 Canonicallink element指向 page A :

    告诉搜索引擎这个页面工作正常,但对我来说它是一个次要页面,我建议将下一个访问者发送到该页面A 而不是。


设计:

因此,基于此,我将如何看待我的规则配置的可能结构:

'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'
],
]

这样我就可以链接尽可能多的数组来使用 Yii 的默认类 yii\web\UrlRule虽然我可以在我的应用程序组件文件夹中有一个自定义的专用于 SEO 相关 Controller 。

在开始编码之前,这是我希望我的网站的行为方式:

  • 您访问 /about 页面,您会收到 200响应(没有添加规范)。
  • 您访问被重定向到的 /deprecated-about 页面/about301状态码。
  • 您访问了被重定向到的 /under-construction-about 页面/about302状态码。
  • 你访问 /about-page-2 页面你会得到一个 200响应(index/about 操作呈现)。除了与此类似的标记之外,没有重定向会自动注入(inject)到源代码中: <link href="http://my-website/about" rel="canonical">
  • 你访问/experimental-about 页面你会得到一个200响应(由其自身的操作呈现 whatever/experimental )但注入(inject)了与上面相同的规范标签。

代码:

SEOUrlRule 将简单地扩展 \yii\web\UrlRule并覆盖它的 parseRequest定义额外属性的方法,我们将根据这些属性强制进行 HTTP 重定向或调用 parent::parseRequest()在将规范链接标签注册到 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);
}
}

这就是它所需要的。注意 Yii::$app->controller或其相关操作在解决路线的这个早期阶段尚不可用,如本 lifecycle diagram 所示。但似乎 Yii::$app->view已经初始化,您可以使用它的 $params属性来设置自定义参数(正如在 example 中所做的那样),这对于应该共享更多数据或将更多数据填充到最终输出的更高级情况可能很有用。

关于php - urlManager 配置中的 Yii 2 规范 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35931672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com