Saya menggunakan versi Angular 2.0.0-alpha.30. Ketika mengarahkan ulang ke rute yang berbeda, maka segarkan peramban, ini menunjukkan Tidak Dapat MENDAPATKAN / rute.
Bisakah Anda membantu saya dengan mencari tahu mengapa kesalahan ini terjadi.
angular
angular2-routing
Vinz dan Tonz
sumber
sumber
Jawaban:
Saat menggunakan perutean html5 Anda perlu memetakan semua rute di aplikasi Anda (saat ini 404) ke index.html di sisi server Anda. Berikut ini beberapa opsi untuk Anda:
menggunakan live-server: https://www.npmjs.com/package/live-server
menggunakan nginx: http://nginx.org/en/docs/beginners_guide.html
Tomcat - konfigurasi web.xml. Dari komentar Kunin
sumber
pub serve
? Dengan begitu saya tidak perlupub build
banyak selama pengembangan. Saya mencoba tetapiproxy_pass
tidak berhasil dengan baikerror_page
.Penafian: perbaikan ini bekerja dengan Alpha44
Saya memiliki masalah yang sama dan menyelesaikannya dengan menerapkan HashLocationStrategy yang tercantum dalam Pratinjau API Angular.io.
https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class.html
Mulailah dengan mengimpor arahan yang diperlukan
Dan akhirnya, bootstrap semuanya bersama seperti itu
Rute Anda akan muncul sebagai http: // localhost / # / route dan ketika Anda menyegarkan, itu akan dimuat ulang di tempat yang semestinya.
Semoga itu bisa membantu!
sumber
#
akan ditambahkan secara otomatis dalam URL. apakah ada solusi untuk menghapus # dari URL dengan menggunakan ini?#
akan optimal.PathLocationStrategy
tetapi ini tidak berhasil untuk saya. baik saya menggunakan metode yang salah atau saya tidak tahu cara menggunakan PathLocationStrategy.Angular secara default menggunakan pushstate HTML5 (
PathLocationStrategy
dalam bahasa gaul Angular).Anda memerlukan server yang memproses semua permintaan seperti yang diminta
index.html
atau Anda beralih keHashLocationStrategy
(dengan # di URL untuk rute) https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class. htmlLihat juga https://ngmilk.rocks/2015/03/09/angularjs-html5-mode-or-pretty-urls-on-apache-using-htaccess/
Untuk beralih
HashLocationStrategy
menggunakanpembaruan untuk> = RC.5 dan 2.0.0 final
atau lebih pendek dengan
useHash
pastikan Anda memiliki semua impor yang diperlukan
Untuk router baru (RC.3)
dapat menyebabkan 404 juga.
Sebaliknya itu membutuhkan
pembaruan untuk> = RC.x
pembaruan untuk> = beta.16 Impor telah berubah
<beta.16
Lihat juga https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta16-2016-04-26 pemecahan-perubahan
sumber
update for >= RC.x
(RC.2) berfungsi denganrouter 3.0.0-alpha.7
, tetapiprovide
dijelaskan sebagai sudah usang tanpa informasi tentang fungsi yang menggantikannya.{provide: SomeClass, useClass: OtherClass}
Saya pikir kesalahan yang Anda lihat adalah karena Anda meminta http: // localhost / rute yang tidak ada. Anda perlu memastikan bahwa server Anda akan memetakan semua permintaan ke halaman index.html utama Anda.
Karena Angular 2 menggunakan perutean html5 secara default alih-alih menggunakan hash di akhir url, menyegarkan laman tampak seperti permintaan untuk sumber daya yang berbeda.
sumber
Ini adalah situasi umum di semua versi router jika Anda menggunakan strategi lokasi HTML default.
Apa yang terjadi adalah bahwa URL pada bar browser normal url HTML penuh, seperti misalnya:
http://localhost/route
.Jadi ketika kita menekan Enter di bilah browser, ada permintaan HTTP yang sebenarnya dikirim ke server untuk mendapatkan file bernama
route
.Server tidak memiliki file seperti itu, dan tidak ada sesuatu seperti express yang dikonfigurasi pada server untuk menangani permintaan dan memberikan respons, sehingga server mengembalikan 404 Tidak Ditemukan, karena tidak dapat menemukan
route
file.Yang kami inginkan adalah server mengembalikan
index.html
file yang berisi aplikasi satu halaman. Maka router harus menendang dan memproses/route
url dan menampilkan komponen yang dipetakan untuk itu.Jadi untuk memperbaiki masalah ini kita perlu mengkonfigurasi server untuk kembali
index.html
(dengan asumsi itu adalah nama file aplikasi satu halaman Anda) jika permintaan tidak dapat ditangani, sebagai lawan dari 404 Tidak Ditemukan.Cara untuk melakukan ini tergantung pada teknologi sisi server yang digunakan. Jika Java-nya misalnya Anda mungkin harus menulis servlet, di Rails akan berbeda, dll.
Untuk memberikan contoh konkret, jika misalnya Anda menggunakan NodeJs, Anda harus menulis middleware seperti ini:
Dan kemudian daftarkan di bagian paling akhir rantai middleware:
Ini akan berfungsi
index.html
alih-alih mengembalikan 404, router akan menendang dan semuanya akan berfungsi seperti yang diharapkan.sumber
Pastikan ini ditempatkan di elemen kepala index.html Anda:
The Contoh di Angular2 Routing & Navigasi menggunakan dokumentasi kode berikut di kepala bukan (mereka menjelaskan mengapa pada contoh catatan hidup dari dokumentasi):
Saat Anda me-refresh halaman, ini secara dinamis akan mengatur basis href ke dokumen Anda saat ini. Lokasi. Saya bisa melihat ini menyebabkan kebingungan bagi orang-orang yang membaca sekilas dokumentasi dan mencoba mereplikasi plunker.
sumber
Jika Anda ingin dapat memasukkan url di browser tanpa mengonfigurasi AppServer Anda untuk menangani semua permintaan ke index.html, Anda harus menggunakan HashLocationStrategy .
Cara termudah untuk mengonfigurasi menggunakan:
Dari pada:
Dengan HashLocationStrategy url Anda akan menjadi seperti:
sumber
#
dari url, dapatkah kita menghapus ini?Saya memiliki masalah yang sama dengan menggunakan webpack-dev-server. Saya harus menambahkan opsi devServer ke paket web saya.
Larutan:
sumber
Jika Anda menggunakan Apache atau Nginx sebagai server Anda harus membuat
.htaccess
(jika tidak dibuat sebelumnya) dan "Aktif" RewriteEnginesumber
Server saya adalah Apache, apa yang saya lakukan untuk memperbaiki 404 saat menyegarkan atau menghubungkan sangat sederhana. Cukup tambahkan satu baris dalam konfigurasi aphost vhost:
Sehingga kesalahan 404 akan dialihkan ke index.html, yang diinginkan oleh routing angular2.
Seluruh contoh file vhost:
Tidak peduli server apa yang Anda gunakan, saya pikir intinya adalah mencari cara untuk mengkonfigurasi server untuk mengarahkan 404 ke index.html Anda.
sumber
Konfigurasi server bukan solusi untuk SPA yang saya pikir. Anda tidak ingin memuat ulang spa sudut lagi jika rute yang salah masuk, bukan? Jadi saya tidak akan bergantung pada rute server dan mengalihkan ke rute lain tapi ya saya akan membiarkan index.html menangani semua permintaan untuk rute sudut dari jalur aplikasi sudut.
Coba ini, bukan sebaliknya atau rute yang salah. Ini bekerja untuk saya, tidak yakin tetapi sepertinya sedang berlangsung. Tersandung ini sendiri ketika menghadapi masalah.
https://github.com/angular/angular/issues/4055
Namun ingatlah untuk mengonfigurasi folder server dan akses Anda jika Anda memiliki HTML atau skrip web yang bukan SPA. Jika tidak, Anda akan menghadapi masalah. Bagi saya ketika menghadapi masalah seperti Anda itu adalah campuran dari konfigurasi server dan di atas.
sumber
untuk perbaikan cepat sudut 5, edit app.module.ts dan tambahkan
{useHash:true}
setelah appRoutes.sumber
Aplikasi sudut adalah kandidat yang sempurna untuk melayani dengan server HTML statis sederhana. Anda tidak memerlukan mesin sisi server untuk secara dinamis menyusun halaman aplikasi karena Angular melakukannya di sisi klien.
Jika aplikasi menggunakan router Angular, Anda harus mengonfigurasi server untuk mengembalikan halaman host aplikasi (index.html) ketika diminta untuk file yang tidak dimiliki.
Aplikasi yang diarahkan harus mendukung "tautan dalam". Tautan yang dalam adalah URL yang menentukan jalur ke komponen di dalam aplikasi. Misalnya, http://www.example.com/heroes/42 adalah tautan yang dalam ke laman detail pahlawan yang menampilkan pahlawan dengan id: 42.
Tidak ada masalah ketika pengguna menavigasi ke URL itu dari dalam klien yang berjalan. Router Angular mengartikan URL dan rute ke halaman dan pahlawan itu.
Tetapi mengklik tautan dalam surel, memasukkannya di bilah alamat peramban, atau sekadar menyegarkan peramban saat berada di laman detail pahlawan - semua tindakan ini ditangani oleh peramban itu sendiri, di luar aplikasi yang sedang berjalan. Browser membuat permintaan langsung ke server untuk URL itu, melewati router.
Server statis secara rutin mengembalikan index.html ketika menerima permintaan untuk http://www.example.com/ . Tetapi ia menolak http://www.example.com/heroes/42 dan mengembalikan 404 - Tidak Ditemukan kesalahan kecuali jika dikonfigurasi untuk mengembalikan index.html sebagai gantinya
Jika masalah ini terjadi dalam produksi, ikuti langkah-langkah di bawah ini
1) Tambahkan file Web.Config di folder src aplikasi sudut Anda. Tempatkan kode di bawah ini di dalamnya.
2) Tambahkan referensi untuk itu di angular-cli.json. Di angular-cli.json, masukkan Web.config di blok aset seperti yang ditunjukkan di bawah ini.
3) Sekarang Anda dapat membangun solusi untuk produksi menggunakan
Ini akan membuat folder dist. File di dalam folder dist siap untuk ditempatkan dengan mode apa pun.
sumber
Anda dapat menggunakan solusi ini untuk aplikasi rata-rata, saya menggunakan ejs sebagai view engine:
dan juga diatur dalam angular-cli.json
itu akan berfungsi dengan baik alih-alih
itu menciptakan masalah dengan mendapatkan panggilan db dan mengembalikan index.html
sumber
Bagi kita yang bergumul dalam kehidupan di IIS: gunakan kode PowerShell berikut untuk memperbaiki masalah ini berdasarkan dokumen resmi Angular 2 (yang seseorang pasang di utas ini? Http://blog.angular-university.io/angular2-router/ )
Ini mengalihkan 404 ke file /index.html sesuai saran di Angular 2 docs (tautan di atas).
sumber
Anda dapat mencoba di bawah ini. Ini bekerja untuk saya!
main.component.ts
Anda selanjutnya dapat meningkatkan path.substr (2) untuk dibagi menjadi parameter router. Saya menggunakan sudut 2.4.9
sumber
i Cukup menambahkan .htaccess di root.
di sini saya hanya menambahkan titik '.' (direktori induk) di /index.html ke ./index.html
pastikan file index.html Anda di jalur dasar adalah jalur direktori utama dan ditetapkan dalam pembangunan proyek.
sumber
Saya ingin mempertahankan jalur URL sub halaman dalam mode HTML5 tanpa pengalihan kembali ke indeks dan tidak ada solusi di luar sana yang memberi tahu saya cara melakukan ini, jadi ini yang saya lakukan:
Buat direktori virtual sederhana di IIS untuk semua rute Anda dan arahkan ke root aplikasi.
Bungkus system.webServer Anda di Web.config.xml Anda dengan tag lokasi ini, jika tidak Anda akan mendapatkan kesalahan duplikat dari itu memuat Web.config untuk kedua kalinya dengan direktori virtual:
sumber
Saya memeriksa dalam sudut 2 biji bagaimana cara kerjanya.
Anda dapat menggunakan express-history-api-fallback untuk mengarahkan ulang secara otomatis saat halaman dimuat ulang.
Saya pikir ini adalah cara paling elegan untuk menyelesaikan masalah IMO ini.
sumber
Jika Anda ingin menggunakan PathLocationStrategy:
Aplikasi satu halaman dengan Java EE / Wildfly: konfigurasi sisi server
sumber
2017-July-11: Karena ini terkait dari pertanyaan yang memiliki masalah ini tetapi menggunakan Angular 2 dengan Electron, saya akan menambahkan solusi saya di sini.
Yang harus saya lakukan adalah menghapus
<base href="./">
dari index.html saya dan Elektron mulai memuat kembali halaman dengan sukses.sumber
Tambahkan impor:
Dan di penyedia NgModule, tambahkan:
Di utama index.html File Aplikasi mengubah basis href
./index.html
dari/
Aplikasi ketika digunakan di server mana pun akan memberikan url nyata untuk halaman yang dapat diakses dari aplikasi eksternal apa pun.
sumber
Hanya menambahkan .htaccess di root diselesaikan 404 sambil menyegarkan halaman dalam sudut 4 apache2.
sumber
Saya pikir Anda mendapatkan 404 karena Anda meminta http: // localhost / rute yang tidak ada di server kucing jantan. Karena Angular 2 menggunakan perutean html 5 secara default daripada menggunakan hash di bagian akhir URL, menyegarkan halaman seperti permintaan untuk sumber daya yang berbeda.
Saat menggunakan perutean sudut pada kucing jantan, Anda perlu memastikan bahwa server Anda akan memetakan semua rute di aplikasi Anda ke index.html utama Anda saat menyegarkan halaman. Ada beberapa cara untuk mengatasi masalah ini. Mana pun yang Anda sukai, Anda bisa melakukannya.
1) Masukkan kode di bawah ini di web.xml dari folder penempatan Anda:
2) Anda juga dapat mencoba menggunakan HashLocationStrategy dengan # di URL untuk rute:
Coba gunakan:
RouterModule.forRoot (rute, {useHash: true})
Dari pada:
RouterModule.forRoot (rute)
Dengan HashLocationStrategy url Anda akan menjadi seperti:
http: // localhost / # / route
3) Katup Ulang URL Tomcat: Tulis ulang url menggunakan konfigurasi tingkat server untuk mengarahkan ulang ke index.html jika sumber daya tidak ditemukan.
3.1) Di dalam folder META-INF buat file context.xml dan salin konteks di bawahnya.
3.2) Di dalam WEB-INF, buat file rewrite.config (file ini berisi aturan untuk Penulisan Ulang URL dan digunakan oleh tomcat untuk penulisan ulang URL). Di dalam rewrite.config, salin konten di bawah ini:
sumber
Ini bukan jawaban yang tepat tetapi Di-refresh Anda dapat mengalihkan semua panggilan mati ke Homepage dengan mengorbankan 404 halaman itu adalah peretasan sementara hanya replay berikut pada file 404.html
sumber
Solusi terbaik untuk menyelesaikan "router-not-working-on-reload-the-browser" adalah bahwa kita harus menggunakan spa-fall back. Jika Anda menggunakan aplikasi angular2 dengan inti asp.net maka kita perlu mendefinisikannya di halaman "StartUp.cs". di bawah MVC routs. Saya melampirkan kode.
sumber
Jawabannya cukup rumit. Jika Anda menggunakan Server Apache lama (atau IIS), Anda mendapatkan masalah karena halaman Angular tidak ada secara nyata. Mereka "dihitung" dari rute Angular.
Ada beberapa cara untuk memperbaiki masalah ini. Salah satunya adalah dengan menggunakan HashLocationStrategy yang ditawarkan oleh Angular. Tetapi tanda yang tajam ditambahkan di URL. Ini terutama untuk kompatibilitas dengan Angular 1 (saya kira). Faktanya adalah bagian setelah tajam bukan bagian dari URL (maka server menyelesaikan bagian sebelum tanda "#"). Itu bisa sempurna.
Berikut metode yang disempurnakan (berdasarkan trik 404). Saya menganggap Anda memiliki versi "terdistribusi" dari aplikasi sudut Anda (
ng build --prod
jika Anda menggunakan Angular-CLI) dan Anda mengakses halaman secara langsung dengan server Anda dan PHP diaktifkan.Jika situs web Anda didasarkan pada halaman (Wordpress misalnya) dan Anda hanya memiliki satu folder yang didedikasikan untuk Angular (bernama "dist" dalam contoh saya), Anda dapat melakukan sesuatu yang aneh tetapi, pada akhirnya, sederhana. Saya berasumsi Anda telah menyimpan halaman Angular Anda di "/ dist" (dengan sesuai
<BASE HREF="/dist/">
). Sekarang gunakan pengalihan 404 dan bantuan PHP.Dalam konfigurasi Apache Anda (atau dalam
.htaccess
file direktori aplikasi sudut Anda), Anda harus menambahkanErrorDocument 404 /404.php
404.php akan dimulai dengan kode berikut:
di mana
$angular
nilai disimpan di HREF sudut Andaindex.html
.Prinsipnya cukup sederhana, jika Apache tidak menemukan halaman, pengalihan 404 dibuat ke skrip PHP. Kami hanya memeriksa apakah halaman tersebut ada di dalam direktori aplikasi sudut. Jika demikian, kami hanya memuat index.html secara langsung (tanpa mengarahkan ulang): ini diperlukan untuk menjaga URL tidak berubah. Kami juga mengubah kode HTTP dari 404 menjadi 200 (hanya lebih baik untuk perayap).
Bagaimana jika halaman tersebut tidak ada dalam aplikasi sudut? Nah, kami menggunakan "catch all" dari router sudut (lihat dokumentasi router Sudut).
Metode ini bekerja dengan aplikasi Angular tertanam di dalam situs web dasar (saya pikir itu akan terjadi di masa depan).
CATATAN:
mod_redirect
(dengan menulis ulang URL) sama sekali bukan solusi yang baik karena file (seperti aset) harus benar-benar dimuat maka itu jauh lebih berisiko daripada hanya menggunakan solusi "tidak ditemukan".ErrorDocument 404 /dist/index.html
karya tetapi Apache masih merespons dengan kode kesalahan 404 (yang buruk untuk perayap).sumber
Ini bukan Perbaikan permanen untuk masalah tetapi lebih seperti solusi atau peretasan
Saya memiliki masalah yang sama ketika menerapkan Aplikasi Angular ke halaman-gh. Pertama saya disambut dengan 404 pesan saat Menyegarkan halaman saya di halaman gh.
Kemudian seperti yang ditunjukkan @ gunter, saya mulai menggunakan
HashLocationStrategy
yang disediakan dengan Angular 2.Tapi itu datang dengan serangkaian masalah sendiri
#
di url itu benar-benar buruk membuat url terlihat aneh seperti inihttps://rahulrsingh09.github.io/AngularConcepts/#/faq
.Saya mulai meneliti tentang masalah ini dan menemukan sebuah blog. Saya mencoba mencobanya dan berhasil.
Inilah yang saya lakukan seperti yang disebutkan di blog itu.
Referensi backalleycoder Berkat @ Daniel untuk solusi ini.
Sekarang URL di atas berubah menjadi https://rahulrsingh09.github.io/AngularConcepts/faq
sumber
Saya memperbaiki ini (menggunakan Java / Spring backend) dengan menambahkan handler yang cocok dengan semua yang didefinisikan dalam rute Angular saya, yang mengirimkan kembali index.html alih-alih 404. Ini kemudian secara efektif (kembali) mem-bootstrap aplikasi dan memuat halaman yang benar. Saya juga memiliki pawang 404 untuk apa pun yang tidak tertangkap oleh ini.
sumber
Jika Anda menggunakan Apache atau Nginx sebagai server, Anda harus membuat .htaccess
sumber