Saya mendapat kesan bahwa Angular akan menulis ulang URL yang muncul dalam atribut href dari tag anchor dalam tempaltes, sehingga mereka akan berfungsi baik dalam mode html5 atau mode hashbang. The dokumentasi untuk layanan lokasi tampaknya mengatakan bahwa HTML link Rewriting mengurus situasi hashbang. Dengan demikian saya berharap bahwa ketika tidak dalam mode HTML5, hash akan dimasukkan, dan dalam mode HTML5, mereka tidak akan melakukannya.
Namun, tampaknya tidak ada penulisan ulang yang terjadi. Contoh berikut tidak memungkinkan saya untuk hanya mengubah mode. Semua tautan dalam aplikasi harus ditulis ulang dengan tangan (atau berasal dari variabel saat runtime. Apakah saya harus menulis ulang semua URL secara manual tergantung pada modenya?
Saya tidak melihat penulisan ulang sisi klien terjadi di Angular 1.0.6, 1.1.4 atau 1.1.3. Tampaknya semua nilai href perlu diawali dengan # / untuk mode hashbang dan / untuk mode html5.
Apakah ada beberapa konfigurasi yang diperlukan untuk menyebabkan penulisan ulang? Apakah saya salah membaca dokumen? Melakukan hal lain yang konyol?
Ini sebuah contoh kecil:
<head>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.3/angular.js"></script>
</head>
<body>
<div ng-view></div>
<script>
angular.module('sample', [])
.config(
['$routeProvider', '$locationProvider',
function ($routeProvider, $locationProvider) {
//commenting out this line (switching to hashbang mode) breaks the app
//-- unless # is added to the templates
$locationProvider.html5Mode(true);
$routeProvider.when('/', {
template: 'this is home. go to <a href="https://stackoverflow.com/about"/>about</a>'
});
$routeProvider.when('/about', {
template: 'this is about. go to <a href="https://stackoverflow.com/"/>home</a'
});
}
])
.run();
</script>
</body>
Tambahan: dalam membaca kembali pertanyaan saya, saya melihat bahwa saya menggunakan istilah "menulis ulang" tanpa banyak kejelasan tentang siapa dan kapan saya ingin melakukan penulisan ulang. Pertanyaannya adalah tentang bagaimana cara mendapatkan Angular untuk menulis ulang URL ketika itu membuat jalur dan bagaimana mendapatkannya untuk menafsirkan jalur dalam kode JS secara seragam di kedua mode. Ini bukan tentang bagaimana menyebabkan server web melakukan penulisan ulang permintaan yang kompatibel dengan HTML5.
sumber
Jawaban:
Dokumentasi tidak begitu jelas tentang perutean AngularJS. Ini berbicara tentang mode Hashbang dan HTML5. Bahkan, perutean AngularJS beroperasi dalam tiga mode:
Untuk setiap mode ada kelas LocationUrl masing-masing (LocationHashbangUrl, LocationUrl dan LocationHashbangInHTML5Url).
Untuk mensimulasikan penulisan ulang URL, Anda harus benar-benar mengatur html5mode menjadi true dan menghias kelas $ sniffer sebagai berikut:
Sekarang saya akan menjelaskan ini secara lebih rinci:
Mode Hashbang
Konfigurasi:
Ini adalah kasus ketika Anda perlu menggunakan URL dengan hash di file HTML Anda seperti di
Di Peramban Anda harus menggunakan Tautan berikut:
http://www.example.com/base/index.html#!/base/path
Seperti yang dapat Anda lihat dalam mode Hashbang murni, semua tautan dalam file HTML harus dimulai dengan basis seperti "index.html #!".
Mode HTML5
Konfigurasi:
Anda harus mengatur basis dalam file HTML
Dalam mode ini Anda dapat menggunakan tautan tanpa # dalam file HTML
Tautan di Browser:
Hashbang dalam Mode HTML5
Mode ini diaktifkan ketika kami benar-benar menggunakan mode HTML5 tetapi di browser yang tidak kompatibel. Kita dapat mensimulasikan mode ini di browser yang kompatibel dengan mendekorasi layanan $ sniffer dan mengatur histori menjadi false.
Konfigurasi:
Atur basis dalam file HTML:
Dalam hal ini tautan juga dapat ditulis tanpa hash dalam file HTML
Tautan di Browser:
sumber
$provide
tidak terdefinisi?Bagi pembaca masa depan, jika Anda menggunakan Angular 1.6 , Anda juga perlu mengubah
hashPrefix
:Jangan lupa untuk mengatur basis di HTML Anda
<head>
:Info lebih lanjut tentang changelog here.
sumber
Ini membutuhkan waktu beberapa saat untuk mencari tahu, jadi inilah cara saya membuatnya berfungsi - Angular WebAPI ASP Routing tanpa # untuk SEO
Tambahkan $ locationProvider.html5Mode (true); ke app.config
Saya membutuhkan pengontrol tertentu (yang ada di pengontrol rumah) untuk diabaikan untuk mengunggah gambar jadi saya menambahkan aturan itu ke RouteConfig
Di Global.asax tambahkan yang berikut - pastikan untuk mengabaikan api dan jalur unggah gambar biarkan mereka berfungsi seperti biasa jika tidak mengalihkan semua yang lain.
Pastikan untuk menggunakan $ location.url ('/ XXX') dan bukan window.location ... untuk mengarahkan ulang
Referensi file CSS dengan jalur absolut
dan tidak
Catatan akhir - melakukannya dengan cara ini memberi saya kontrol penuh dan saya tidak perlu melakukan apa pun pada konfigurasi web.
Semoga ini bisa membantu karena ini perlu waktu untuk mencari tahu.
sumber
Saya ingin dapat mengakses aplikasi saya dengan mode HTML5 dan token tetap dan kemudian beralih ke metode hashbang (untuk menjaga token sehingga pengguna dapat menyegarkan halamannya).
URL untuk mengakses aplikasi saya:
http://myapp.com/amazing_url?token=super_token
Lalu ketika pengguna memuat halaman:
http://myapp.com/amazing_url?token=super_token#/amazing_url
Lalu ketika pengguna menavigasi:
http://myapp.com/amazing_url?token=super_token#/another_url
Dengan ini saya menyimpan token di URL dan mempertahankan status saat pengguna menjelajah. Saya kehilangan sedikit visibilitas URL, tetapi tidak ada cara yang sempurna untuk melakukannya.
Jadi jangan aktifkan mode HTML5 dan kemudian tambahkan controller ini:
sumber