Hasilkan halaman SEO statis untuk situs web AngularJS + Spring MVC

Saya punya proyek menggunakan Spring MVC + AngularJS. Semua data bersifat dinamis. Miliki database lokasi yang besar di aplikasi ini.

Untuk tujuan SEO, perlu membuat laman statis untuk setiap lokasi dan menempatkannya di URL yang ramah SEO (mis. /localhost/path1/path2/here-is-very-friendly-name)

Apa cara terbaik untuk membuatnya?

Haruskah saya membuat halaman secara terpisah dan meletakkannya di folder terpisah dari aplikasi utama (jika ya, apa cara terbaik untuk membuatnya?), atau saya dapat menggunakan Spring/Angular untuk itu?

(untuk info tambahan) setiap objek lokasi berisi id,name, latitude, longtitude, address, district, city, country.


person user1935987    schedule 22.06.2016    source sumber
comment
Anda harus memberi hadiah pada pertanyaan ini. Ini cukup menarik.   -  person Demeter Dimitri    schedule 22.06.2016


Jawaban (4)


Sebenarnya ini pengalaman Angular/SEO saya.
Anda harus melakukan banyak perubahan!!


1) Menghapus # dari url

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

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

}]);

2) Tinjau Perutean MVC Anda

Sampai sekarang mungkin Anda memiliki satu HomeController untuk mengembalikan index.cshtml dan mem-boot Aplikasi Angular Anda.
Setelah menghapus # dari perutean Angular, Anda harus menyetel MapRoute untuk semua rute Anda.
Karena dalam situasi ini pertama kali Anda mencobanya untuk mengunjungi rute seperti www.site.com/any_route Aplikasi Angular belum dimuat sehingga mencoba mendapatkan halaman dari MVC Routing. Namun setelah itu $routeProvider menjalankan tugasnya.


3) Gunakan variabel MVC untuk tag meta

Untuk pengindeksan yang lebih baik dan berteman dengan perayap dan bot, kita harus menggunakan variabel MVC untuk menginisialisasi tag meta situs web.
Jika Anda menyetel judul laman dengan pengikatan Angular seperti <title>{{title}}</title> kapan pun Anda ingin membagikan laman Anda melalui jejaring sosial, Anda akan melihat {{title}} karena jejaring sosial tidak dapat merender situs.

<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) Ganti pengikatan Angular untuk tag meta

Aplikasi kami adalah SPA, jadi setelah memuat Angular kami keluar dari taman bermain MVC. Kita harus mengganti variabel Angular dengan variabel 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) gunakan JSON-lD untuk konten dinamis

Jika Anda familiar dengan SCHEMA.org Anda lebih baik menggunakan JSON-LD daripada yang lain, karena bot mesin pencari dapat menangkap dan menganalisis <script type="application/ld+json"></script>s yang disisipkan secara dinamis setelah halaman dimuat.
Anda harus memeriksa Schema Dictionary untuk menemukan tipe yang paling dekat dengan struktur data Anda.
Misalnya perusahaan saya 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": "[email protected]",
        "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>
person MeTe-30    schedule 29.06.2016
comment
Hai, terima kasih atas balasan Anda. Ini berguna dan informatif untuk SEO aplikasi semacam itu. Tapi, ini bukanlah jawaban untuk pertanyaan awal. - person user1935987; 29.06.2016
comment
@ user1935987Apakah Anda yakin?? - person MeTe-30; 29.06.2016

Sudahkah Anda mencoba alat seperti SEO.js (http://getseojs.com/) dan prerender.io (https://prerender.io/). Sudahkah Anda mencobanya?

person Shankar P S    schedule 24.06.2016
comment
ya, saya tahu tentang alat itu, tetapi ini hanya solusi untuk keberadaan halaman itu sendiri, tidak menjawab pertanyaan sama sekali. - person user1935987; 25.06.2016

Saya sendiri belum mencobanya tetapi PhantomJs kemungkinan akan menjadi pilihan terbaik untuk dapat melakukan ini.

Anda memerlukan kamus titik akhir yang ingin Anda render dan nama jalur file statis yang sesuai. Anda kemudian akan mengulangi setiap titik akhir, merender jalur yang diberikan dengan PhantomJS dan kemudian menyimpan hasilnya ke dalam file statis.

Dari apa yang saya kumpulkan dari pertanyaan Anda, Anda belum benar-benar menggunakan jalur ini di front-end di aplikasi sudut Anda? Jika ini masalahnya maka saya akan mengatakan bahwa opsi lainnya adalah merendernya di sisi server hanya melalui Spring.

Masalahnya di sini adalah bahwa sudut tidak dibuat dengan mempertimbangkan isomorfisme (render sisi klien dan server). Rendering apa pun yang ingin Anda lakukan di sisi server yang belum dibuat, opsi terbaik adalah menggunakan Spring untuk merendernya.

Pilihan lainnya adalah memperbarui ke Angular2 yang isomorfik dengan bantuan sudut universal. Jika Spring tidak digunakan untuk rendering dan hanya berfungsi sebagai API untuk aplikasi Anda, opsi ini akan berfungsi dengan baik.

person Ian Belcher    schedule 30.06.2016

saya tidak melakukan ini di java tetapi C#, tolong beri tahu saya jika Anda membuatnya berfungsi di java:

saya menemukan potongan kode tentang phantomJs, dan:

seperti kata teman kami, kami mengaktifkan mode HTML5, kami menulis ulang semua url di C# menggunakan mesin tulis yang baru di IIS, saya menyimpan satu aturan khusus untuk permintaan Google yang datang dengan parameter kueri spesifik (tidak dapat menemukannya melalui internet dan tidak banyak waktu sampai bekerja). jadi saya mengarahkan mereka ke halaman khusus ini, saya membaca url yang dialihkan, meneruskannya dan menjalankannya di phantomJS, dan menunggu hasilnya kembali (perlu mengetahui tentang menjalankan suatu proses dan mengambil kembali hasil konsolnya), lalu, kami menghapus atribut ng-app dari aplikasi, dan meneruskan halaman mentah ke perayap Google (kami memiliki dua jenis kode pengalihan, hanya satu yang berfungsi, hingga saat itu, satu bersifat permanen dan lainnya bersifat sementara). halaman untuk diri Anda sendiri sangat kasar untuk dilihat, tetapi Google hanya melihat skema dan struktur Anda, jadi semuanya dapat ditemukan dengannya.

Sudah lama saya tidak mengenal Java, jadi saya tidak bisa menerapkannya, saya hanya mendapatkan sedikit pengetahuan di musim semi, jadi saya akan menghargai jika Anda memberi tahu saya tentang pembaruan apa pun.

person deadManN    schedule 14.01.2017