8 votes

Générer des pages statiques de référencement pour un site Web AngularJS + Spring MVC

J'ai un projet utilisant Spring MVC + AngularJS. Toutes les données sont dynamiques. J'ai une grande base de données de lieux dans cette application.

À des fins de référencement, nécessité de générer une page statique pour chaque site et de les placer sur des URL faciles à référencer. (ex. /localhost/path1/path2/here-is-very-friendly-name)

Quelle est la meilleure façon de le faire ?

Dois-je simplement générer des pages séparément et les placer dans un dossier distinct de l'application principale (si c'est le cas, quelle est la meilleure façon de le faire ?), ou puis-je utiliser Spring/Angular pour cela ?

(pour plus d'informations) l'objet de chaque emplacement contient id , name , latitude , longtitude , address , district , city , country .

8voto

MeTe-30 Points 531

En fait, c'est mon expérience d'Angular/SEO.
Vous devez faire beaucoup de changements !


1) Enlever # à partir de l'url

app.config(['$locationProvider', function ($locationProvider) {

    $locationProvider.html5Mode({
        enabled: true,
        requireBase: false
    });

}]);

2) Révisez votre routage MVC

Jusqu'à présent, vous aviez peut-être un HomeController pour renvoyer les données. index.cshtml et de démarrer votre application Angular.
Après avoir retiré # à partir du routage Angular, vous devez définir MapRoute pour tous vos itinéraires.
Parce que dans cette situation, la première fois que vous essayez de visiter des itinéraires tels que www.site.com/any_route L'application Angular n'étant pas encore chargée, elle tente de récupérer la page à partir du routage MVC. Mais après cela $routeProvider s'acquitter de ses fonctions.


3) Utiliser les variables MVC pour les balises méta

Pour une meilleure indexation et pour être amis avec les crawlers et les bots, nous devons utiliser les variables MVC pour initialiser les balises méta du site web.
Si vous définissez le titre de votre page par des liens Angular comme <title>{{title}}</title> lorsque vous voulez partager votre page via les réseaux sociaux, vous verrez {{title}} parce que les réseaux sociaux ne peuvent pas rendre les sites.

<title>@ViewBag.title</title>
<meta name="Description" content="@ViewBag.description">
<meta name="Keywords" content="@ViewBag.keywords">
<meta property="og:title" content="@ViewBag.title" />
<meta property="og:description" content="@ViewBag.description" />

4) Remplacer le binding Angular pour les meta tags

Notre application est une SPA, donc après avoir chargé Angular, nous sommes sortis du terrain de jeu MVC. Nous devons remplacer les variables Angular par des variables MVC.

angular.element('title').remove();
angular.element('meta[name="Description"]').remove();
angular.element('meta[name="Keywords"]').remove();
angular.element('meta[property="og:title"]').remove();
angular.element('meta[property="og:description"]').remove();

var description = angular.element('<meta name="Description" content="{{meta.description}}">');
angular.element('head').prepend(description);    

var keyword = angular.element('<meta name="Keywords" content="{{meta.keywords}}">');
angular.element('head').prepend(keyword);    

var titleOg = angular.element('<meta property="og:title" content="{{meta.title}}" />');
angular.element('head').prepend(titleOg);    

var descriptionOg = angular.element('<meta property="og:description" content="{{meta.description}}" />');
angular.element('head').prepend(descriptionOg);

var title = angular.element('<title ng-bind="meta.title"></title>');
angular.element('head').prepend(title);  

$rootScope.$applyAsync(function () {
    $compile(title)($rootScope);
    $compile(description)($rootScope);
    $compile(keyword)($rootScope);
    $compile(titleOg)($rootScope);
    $compile(descriptionOg)($rootScope);
});

5) utiliser JSON-lD pour les contenus dynamiques

Si vous êtes familier avec SCHEMA.org il est préférable d'utiliser JSON-LD plutôt que d'autres, car les robots des moteurs de recherche peuvent attraper et analyser <script type="application/ld+json"></script> qui sont insérés dynamiquement après le chargement de la page.
Vous devez vérifier Schema Dictionary pour trouver le type qui est le plus proche de votre structure de données.
Par exemple, c'est mon entreprise json-ld :

<script type="application/ld+json">
    {
        "@context" : "http://schema.org",
        "@type" : "Organization",
        "name" : "داده کاوان امیرکبیر",
        "alternateName" : "ADM | Amirkabir Data Miners",
        "description": "شرکت داده کاوان امیرکبیر | تولید کننده نرم افزارهای تحت وب، از قبیل حسابداری آنلاین 'کاج سیستم' ، سیستم مدیریت پروژه 'تسک من' و ...",
        "url" : "https://adm-co.net",
        "email": "info@adm-co.net",
        "logo": {
            "@type": "ImageObject",
            "url": "http://khoonamon.com/images/ADM_Logo.png",
            "caption": "لوگو داده کاوان امیرکبیر",
            "width": "2480px",
            "height": "1459px"
        },
        "telephone": "+98-21-44002963",
        "address": "تهران، خیابان آیت ا... کاشانی، نبش خیابان عقیل، پلاک 380، طبقه دوم",
        "contactPoint" : [{
            "@type" : "ContactPoint",
            "telephone" : "+98-21-44002963",
            "contactType" : "customer service",
            "contactOption" : "TollFree",
            "areaServed" : "IR",
            "availableLanguage" : "Persian"
        }],
        "sameAs" : [
            "https://google.com/+ADMcoNet-GPlus",
            "https://www.linkedin.com/company/adm-amirkabir-data-miners-?trk=biz-companies-cym",
            "https://instagram.com/AmirkabirDataMiners/",
            "https://www.facebook.com/AmirkabirDataMiners",
            "http://www.pinterest.com/AmirkabirDM/",
            "https://twitter.com/AmirkabirDM",
            "https://www.youtube.com/channel/UCQxP0vZA05Pl9GlyXXQt14A/about"
        ]
    }
</script>

1voto

Shankar P S Points 953

Avez-vous essayé des outils comme SEO.js ( http://getseojs.com/ ) et prerender.io ( https://prerender.io/ ). Les avez-vous essayés ?

1voto

Ian Belcher Points 2972

Je ne l'ai pas essayé moi-même mais PhantomJs serait probablement la meilleure option pour pouvoir le faire.

Vous aurez besoin d'un dictionnaire des points d'extrémité que vous voulez rendre et de leurs noms de chemin de fichier statique correspondants. Vous devrez ensuite itérer sur chaque point d'extrémité, rendre le chemin donné avec PhantomJS, puis enregistrer la sortie dans le fichier statique.

D'après ce que je comprends de votre question, vous n'avez pas encore utilisé ces chemins en front-end dans votre application angulaire ? Si c'est le cas, je dirais que l'autre option est de les rendre côté serveur via Spring.

Le problème est qu'Angular n'a pas été conçu dans un souci d'isomorphisme (rendu côté client et côté serveur). Tout rendu correct que vous voulez faire du côté serveur et qui n'a pas encore été construit, la meilleure option est d'utiliser Spring pour le rendre.

Une autre option est la mise à jour vers Angular2 qui est isomorphe avec l'aide d'angular universal. Si Spring n'est pas utilisé pour le rendu et sert uniquement d'API pour votre application, cette option fonctionnera bien.

0voto

deadManN Points 109

Je ne l'ai pas fait en java mais en C#, merci de me prévenir si vous le faites fonctionner en java :

J'ai trouvé ce bout de code à propos de PhantomJs, et.. :

Comme notre ami l'a dit, nous avons activé le mode html5, nous réécrivons toutes les url en C# en utilisant le moteur d'écriture qui est nouveau pour IIS, je garde une règle spécifique pour la requête google qui est venue avec un paramètre de requête spécifique (je ne pouvais pas le trouver sur le net et pas beaucoup de temps avant le travail). Donc je les redirige vers cette page spécifique, je lis l'url redirigée, je la passe et l'exécute sur phantomJS, et j'attends que le résultat revienne (j'ai besoin de savoir comment exécuter un processus et récupérer le résultat de la console), ensuite, nous avons enlevé l'attribut ng-app de l'application, et nous passons la page brute au crawler de google (nous avons deux types de code de redirection, seulement un d'entre eux a fonctionné, enfin jusqu'à ce moment, l'un est permanent et l'autre temporaire). la page pour vous-même est si grossière à regarder, mais google ne regarde que votre schéma et la structure, donc tout est trouvé avec elle.

Cela fait longtemps que je n'ai pas travaillé avec Java, donc je ne peux pas l'implémenter, je n'ai que quelques connaissances sur Spring, donc j'apprécierai si vous me prévenez de toute mise à jour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X