Melihat komentar pada jawaban yang diterima dan sifat umum dari pertanyaan ini ('tidak berfungsi'), saya pikir ini mungkin tempat yang bagus untuk beberapa penjelasan umum tentang masalah yang terlibat di sini. Jadi jawaban ini dimaksudkan sebagai informasi latar belakang / elaborasi pada kasus penggunaan khusus OP. Tolong bersamaku.
Sisi server vs sisi Klien
Hal besar pertama yang harus dipahami tentang hal ini adalah bahwa sekarang ada 2 tempat di mana URL ditafsirkan, sedangkan dulu hanya ada 1 di 'masa lalu'. Di masa lalu, ketika hidup itu sederhana, beberapa pengguna mengirim permintaanhttp://example.com/about
ke server, yang memeriksa bagian jalur URL, menentukan pengguna meminta halaman tentang dan kemudian mengirim kembali halaman itu.
Dengan perutean sisi klien, yang disediakan oleh React-Router, segalanya menjadi kurang sederhana. Pada awalnya, klien belum memiliki kode JS yang dimuat. Jadi permintaan pertama akan selalu ke server. Itu kemudian akan mengembalikan halaman yang berisi tag skrip yang diperlukan untuk memuat Bereaksi dan Bereaksi Router dll. Hanya ketika skrip-skrip itu dimuat, fase 2 dimulai. Pada fase 2, ketika pengguna mengklik tautan navigasi 'Tentang kami' misalnya, URL diubah secara lokal saja menjadi http://example.com/about
(dimungkinkan oleh API Sejarah ), tetapi tidak ada permintaan ke server dibuat. Alih-alih, React Router melakukan tugasnya di sisi klien, menentukan tampilan Bereaksi mana yang akan di-render dan dirender. Dengan asumsi halaman tentang Anda tidak perlu melakukan panggilan REST, itu sudah dilakukan. Anda telah beralih dari Rumah ke Tentang Kami tanpa ada permintaan server yang dipecat.
Jadi pada dasarnya ketika Anda mengklik sebuah tautan, beberapa Javascript berjalan yang memanipulasi URL di bilah alamat, tanpa menyebabkan penyegaran halaman , yang pada gilirannya menyebabkan React Router untuk melakukan transisi halaman di sisi klien .
Tetapi sekarang pertimbangkan apa yang terjadi jika Anda menyalin-tempel URL di bilah alamat dan mengirimkannya lewat email ke teman. Teman Anda belum memuat situs web Anda. Dengan kata lain, dia masih dalam fase 1 . Belum ada React Router yang berjalan di mesinnya. Jadi browsernya akan membuat permintaan server untuk http://example.com/about
.
Dan di sinilah masalah Anda dimulai. Hingga saat ini, Anda bisa lolos hanya dengan meletakkan HTML statis di webroot server Anda. Tetapi itu akan memberikan 404
kesalahan untuk semua URL lain ketika diminta dari server . URL yang sama berfungsi dengan baik di sisi klien , karena ada React Router melakukan perutean untuk Anda, tetapi mereka gagal di sisi server kecuali Anda membuat server Anda memahaminya.
Menggabungkan perutean server dan sisi klien
Jika Anda ingin http://example.com/about
URL berfungsi di sisi server dan sisi klien, Anda perlu mengatur rute untuk itu di sisi server dan sisi klien. Masuk akal bukan?
Dan di sinilah pilihan Anda dimulai. Solusi berkisar dari mem-bypass masalah sama sekali, melalui rute catch-all yang mengembalikan bootstrap HTML, ke pendekatan isomorfik lengkap di mana server dan klien menjalankan kode JS yang sama.
.
Memotong masalah sama sekali: Sejarah Hash
Dengan Hash History alih-alih Riwayat Browser , URL Anda untuk halaman tentang akan terlihat seperti ini:
http://example.com/#/about
Bagian setelah #
simbol hash ( ) tidak dikirim ke server. Jadi server hanya melihat http://example.com/
dan mengirim halaman indeks seperti yang diharapkan. React-Router akan mengambil #/about
bagian itu dan menampilkan halaman yang benar.
Kerugian :
- URL 'jelek'
- Render sisi server tidak dimungkinkan dengan pendekatan ini. Sejauh menyangkut Search Engine Optimization (SEO), situs web Anda terdiri dari satu halaman dengan hampir tidak ada konten di dalamnya.
.
Tangkap semua
Dengan pendekatan ini, Anda menggunakan Riwayat Peramban, tetapi hanya mengatur catch-all pada server yang mengirim /*
keindex.html
, secara efektif memberi Anda banyak situasi yang sama seperti dengan Hash History. Namun Anda memiliki URL bersih dan Anda dapat memperbaiki skema ini nanti tanpa harus membatalkan semua favorit pengguna Anda.
Kerugian :
- Lebih rumit untuk diatur
- Masih belum bagus SEO
.
Hibrida
Dalam pendekatan hibrida, Anda memperluas skenario catch-all dengan menambahkan skrip khusus untuk rute tertentu. Anda dapat membuat beberapa skrip PHP sederhana untuk mengembalikan halaman terpenting situs Anda dengan konten yang disertakan, sehingga Googlebot setidaknya dapat melihat apa yang ada di halaman Anda.
Kerugian :
- Bahkan lebih rumit untuk diatur
- Hanya SEO yang bagus untuk rute yang Anda berikan perlakuan khusus
- Kode duplikat untuk merender konten di server dan klien
.
Isomorfis
Bagaimana jika kita menggunakan Node JS sebagai server kita sehingga kita dapat menjalankan kode JS yang sama di kedua ujungnya? Sekarang, kita memiliki semua rute yang kita tentukan dalam satu konfigurasi router reaksi dan kita tidak perlu menduplikasi kode rendering kita. Jadi ini adalah 'cawan suci'. Server mengirimkan markup yang sama persis seperti yang kita akan berakhir jika transisi halaman telah terjadi pada klien. Solusi ini optimal dalam hal SEO.
Kerugian :
- Server harus (dapat) menjalankan JS. Saya sudah bereksperimen dengan Java icw Nashorn tetapi tidak berhasil untuk saya. Dalam praktiknya itu sebagian besar berarti Anda harus menggunakan server berbasis Node JS.
- Banyak masalah lingkungan yang rumit (menggunakan
window
sisi server dll)
- Curam kurva pembelajaran
.
Yang mana yang harus saya gunakan?
Pilih salah satu yang bisa Anda hindari. Secara pribadi saya pikir hasil tangkapan-semua cukup sederhana untuk diatur, jadi itu adalah minimum saya. Pengaturan ini memungkinkan Anda untuk memperbaiki berbagai hal dari waktu ke waktu. Jika Anda sudah menggunakan Node JS sebagai platform server Anda, saya pasti akan menyelidiki melakukan aplikasi isomorfik. Ya itu sulit pada awalnya, tetapi begitu Anda memahami itu sebenarnya solusi yang sangat elegan untuk masalah tersebut.
Jadi pada dasarnya, bagi saya, itu akan menjadi faktor penentu. Jika server saya berjalan pada Node JS, saya akan menggunakan isomorfis; kalau tidak saya akan mencari solusi Catch-all dan hanya mengembangkannya (solusi Hybrid) seiring berjalannya waktu dan persyaratan SEO menuntutnya.
Jika Anda ingin mempelajari lebih lanjut tentang rendering isomorfis (juga disebut 'universal') dengan React, ada beberapa tutorial bagus tentang subjek ini:
Juga, untuk memulai, saya sarankan untuk melihat beberapa starter kit. Pilih satu yang cocok dengan pilihan Anda untuk tumpukan teknologi (ingat, Bereaksi hanyalah V di MVC, Anda perlu lebih banyak barang untuk membangun aplikasi lengkap). Mulailah dengan melihat yang diterbitkan oleh Facebook sendiri:
Atau pilih salah satu dari banyak oleh komunitas. Ada situs bagus sekarang yang mencoba mengindeks semuanya:
Saya mulai dengan ini:
Saat ini saya menggunakan versi render universal buatan sendiri yang terinspirasi oleh dua starter kit di atas, tetapi sekarang sudah ketinggalan zaman.
Semoga berhasil dengan pencarian Anda!