Laravel 如何使动态元数据更改Vue中SEO的实际页面源

Laravel 如何使动态元数据更改Vue中SEO的实际页面源,laravel,vue.js,seo,vue-router,Laravel,Vue.js,Seo,Vue Router,我目前正在通过Vue路由器更改页面标题,并在不久的将来更改元数据,如下所示: $route (to, from){ document.title = to.meta.title } 当我检查标题时,这很好: <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" cont

我目前正在通过Vue路由器更改页面标题,并在不久的将来更改元数据,如下所示:

$route (to, from){
    document.title = to.meta.title
}
当我检查标题时,这很好:

    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Updated Page Title</title>
        <link href=" /css/app.css?id=b21c63ebd0cb0655a4d8" rel="stylesheet">
    </head>
但是,当我查看页面源时,它会显示旧信息:

    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        *** <title>Old Page Title</title> ***
        <link href=" /css/app.css?id=b21c63ebd0cb0655a4d8" rel="stylesheet">
    </head>
我需要的标题和元信息都是动态的搜索引擎优化的目的。我的问题有两个方面:

使用vue元插件是否可以从原始来源解决页面标题问题

我是否必须使用SSR或预渲染之类的方法来获取动态元信息,或者他们的任何其他方法是否与此类似

vue meta仅在执行JavaScript并呈现页面时应用。所以,不,当您查看页面源代码时,您不会看到这些元标记

您需要SSR还是预渲染?大概这取决于你想要实现什么。如果有一个伟大的搜索引擎优化,直到网络爬虫支持JS是至关重要的网站?那么,是的

当然,您仍然可以在后端添加一些元标记。根据您使用的语言/框架,有很多选项可以帮助实现这一点。例如,对于Laravel,您可以查看软件包

这个问题的另一个解决方法是将您的请求分类为来自前端的请求和来自爬虫的请求。例如,您可以通过检查请求中的用户代理来实现这一点,然后您可以调整爬虫的响应,例如,将元标记相应地注入到头中

下面是我建议的解决方法的一个示例:

IndexController.php

布局/crawler.blade.php

如您所见,我正在创建一个爬虫列表,然后检查请求是否来自爬虫,如果为true,则应用元标记并返回为此目的创建的特定布局

注意事项:

这不会将元标记应用于您的正常请求。 您需要找到一种方法来过滤请求URL并动态应用标记。例如,使用RegEx。 vue meta仅在执行JavaScript并呈现页面时应用。所以,不,当您查看页面源代码时,您不会看到这些元标记

您需要SSR还是预渲染?大概这取决于你想要实现什么。如果有一个伟大的搜索引擎优化,直到网络爬虫支持JS是至关重要的网站?那么,是的

当然,您仍然可以在后端添加一些元标记。根据您使用的语言/框架,有很多选项可以帮助实现这一点。例如,对于Laravel,您可以查看软件包

这个问题的另一个解决方法是将您的请求分类为来自前端的请求和来自爬虫的请求。例如,您可以通过检查请求中的用户代理来实现这一点,然后您可以调整爬虫的响应,例如,将元标记相应地注入到头中

下面是我建议的解决方法的一个示例:

IndexController.php

布局/crawler.blade.php

如您所见,我正在创建一个爬虫列表,然后检查请求是否来自爬虫,如果为true,则应用元标记并返回为此目的创建的特定布局

注意事项:

这不会将元标记应用于您的正常请求。 您需要找到一种方法来过滤请求URL并动态应用标记。例如,使用RegEx。
我最终使用了hatef提供的这个包作为psuedo解决方案,而没有进行完整的SSR元编辑:

我实现了一个中间件层来检查哪个域正在被多域应用程序使用,然后根据vue路由器的给定端点动态附加元标题:

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Log;
use Illuminate\Routing\UrlGenerator;
use Butschster\Head\Facades\Meta;
use App\Models\Local\Domains;

use Closure;

class ValidateSEO
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $tempSplit = preg_split('/[\/\/]/', url()->current());
        $domain = Domains::where('domain', $tempSplit[2])->first();

        //length specific check based on site requirements and endpoints
        if($domain && count($tempSplit) <= 4){
            //set meta data based on brand site visited
            $linkedBrands = $domain->brands()->get();
            $selectedBrand = [];
            foreach($linkedBrands as $brand){
                $selectedBrand = $brand;
                break;
            }
            if(isset($selectedBrand['name'])){
                Meta::setTitle($selectedBrand['name'] . ' | Guide')
                ->setDescription($selectedBrand['description'])
                ->setKeywords(['sample' , 'keywords', 'here']);
            } else {
                Meta::setTitle(' Guide')
                ->setKeywords(['sample' , 'keywords', 'here']);
            }
            
        } else {
            //set meta data based on admin endpoint
            Meta::setTitle('Admin | ' . ucfirst($tempSplit[4]));
        }

        return $next($request);
    }
}

我最终使用了hatef提供的这个包作为psuedo解决方案,而没有进行完整的SSR元编辑:

我实现了一个中间件层来检查哪个域正在被多域应用程序使用,然后根据vue路由器的给定端点动态附加元标题:

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Log;
use Illuminate\Routing\UrlGenerator;
use Butschster\Head\Facades\Meta;
use App\Models\Local\Domains;

use Closure;

class ValidateSEO
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $tempSplit = preg_split('/[\/\/]/', url()->current());
        $domain = Domains::where('domain', $tempSplit[2])->first();

        //length specific check based on site requirements and endpoints
        if($domain && count($tempSplit) <= 4){
            //set meta data based on brand site visited
            $linkedBrands = $domain->brands()->get();
            $selectedBrand = [];
            foreach($linkedBrands as $brand){
                $selectedBrand = $brand;
                break;
            }
            if(isset($selectedBrand['name'])){
                Meta::setTitle($selectedBrand['name'] . ' | Guide')
                ->setDescription($selectedBrand['description'])
                ->setKeywords(['sample' , 'keywords', 'here']);
            } else {
                Meta::setTitle(' Guide')
                ->setKeywords(['sample' , 'keywords', 'here']);
            }
            
        } else {
            //set meta data based on admin endpoint
            Meta::setTitle('Admin | ' . ucfirst($tempSplit[4]));
        }

        return $next($request);
    }
}

我使用的是laravel后端,所以我会看看这个包。为了回答你的问题,是的,我确实需要尽可能好的SEO,我刚刚看到其他帖子推荐vue meta,但如果它与我的动态路线更改做相同的事情,则几乎没有必要。我认为vue meta更适合与Nuxt.js和SSR一起使用。在Vue应用程序中使用它也不是完全无用的,因为有些爬虫程序可以执行JS。如果您想走捷径,可以遵循我上面推荐的解决方法。我将附加一个例子来帮助您。谢谢,在看到您使用中间件层进行动态元更改的更新之前,我实现了类似的功能。我认为这是一个很好的解决办法,我很感谢向我展示这个软件包,我将不得不监控它,看看它是否能完全解决我的SEO问题。我使用的是laravel后端,所以我会看看这个软件包。回答你的问题
estion,是的,我确实需要尽可能好的SEO,我刚刚看到其他帖子推荐vue meta,但如果它与我的动态路线更改做相同的事情,则几乎没有必要。我认为vue meta更适合与Nuxt.js和SSR一起使用。在Vue应用程序中使用它也不是完全无用的,因为有些爬虫程序可以执行JS。如果您想走捷径,可以遵循我上面推荐的解决方法。我将附加一个例子来帮助您。谢谢,在看到您使用中间件层进行动态元更改的更新之前,我实现了类似的功能。我认为这是一个很好的解决办法,我很感激向我展示这个软件包,我将不得不监控它,看看它是否能完全解决我的SEO问题。描述元背后的逻辑似乎有点奇怪,但我认为这是一个好的开始。你可以随时改进。谢谢,描述和链接的品牌一起存储在数据库中,这很好。描述元背后的逻辑似乎有点奇怪,但我认为这是一个好的开始。您可以随时改进它。谢谢,描述与链接的品牌一起存储在数据库中,这就是原因
<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Log;
use Illuminate\Routing\UrlGenerator;
use Butschster\Head\Facades\Meta;
use App\Models\Local\Domains;

use Closure;

class ValidateSEO
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $tempSplit = preg_split('/[\/\/]/', url()->current());
        $domain = Domains::where('domain', $tempSplit[2])->first();

        //length specific check based on site requirements and endpoints
        if($domain && count($tempSplit) <= 4){
            //set meta data based on brand site visited
            $linkedBrands = $domain->brands()->get();
            $selectedBrand = [];
            foreach($linkedBrands as $brand){
                $selectedBrand = $brand;
                break;
            }
            if(isset($selectedBrand['name'])){
                Meta::setTitle($selectedBrand['name'] . ' | Guide')
                ->setDescription($selectedBrand['description'])
                ->setKeywords(['sample' , 'keywords', 'here']);
            } else {
                Meta::setTitle(' Guide')
                ->setKeywords(['sample' , 'keywords', 'here']);
            }
            
        } else {
            //set meta data based on admin endpoint
            Meta::setTitle('Admin | ' . ucfirst($tempSplit[4]));
        }

        return $next($request);
    }
}