Router 2.0 sudut tidak berfungsi memuat ulang peramban

190

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.

Vinz dan Tonz
sumber
1
Saya kira itu adalah stackoverflow.com/questions/16569841
Günter Zöchbauer
Terima kasih atas jawabannya, tetapi itu untuk versi 1.x sudut. Saya menghadapi masalah di sudut 2.0.
Vinz dan Tonz
1
Pertanyaan yang ditautkan adalah masalah umum dengan pushState tidak spesifik Angular. Pertanyaan Anda tidak memberikan informasi yang cukup untuk mengetahui apakah itu terkait.
Günter Zöchbauer
5
Angular 2.0 menggunakan router yang benar-benar baru sehingga pos yang ditautkan tidak digunakan sekarang karena router yang lama
Vinz dan Tonz
Seperti yang saya katakan jika itu adalah masalah pushState itu bukan spesifik Angular dan tidak dapat diperbaiki oleh Angular tetapi perlu diperbaiki pada server sebagai gantinya.
Günter Zöchbauer

Jawaban:

141

Kesalahan yang Anda lihat adalah karena Anda meminta http: // localhost / rute yang tidak ada. Menurut Simon .

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:

  1. menggunakan live-server: https://www.npmjs.com/package/live-server

    $live-server --entry-file=index.html`
    
  2. menggunakan nginx: http://nginx.org/en/docs/beginners_guide.html

    error_page 404 /index.html
    
  3. Tomcat - konfigurasi web.xml. Dari komentar Kunin

    <error-page>
          <error-code>404</error-code>
          <location>/index.html</location>
    </error-page>
    
Quy Tang
sumber
1
Karena seseorang memerlukan dukungan sisi server untuk perutean HTML5 ini berfungsi dengan baik. Terima kasih
Prabhat
Bisakah saya menggunakan nginx sebagai proxy pub serve? Dengan begitu saya tidak perlu pub buildbanyak selama pengembangan. Saya mencoba tetapi proxy_passtidak berhasil dengan baik error_page.
Franklin Yu
@ FranklinYu saya belum pernah melakukannya sebelumnya. Apakah Anda menyelesaikannya?
Quy Tang
1
Menggunakan nginx. , error_page 404 /index.html di lokasi aplikasi berfungsi untuk saya. Terima kasih.
Richard K. Campion
2
Tomcat - konfigurasi web.xml <error-page> <error-code> 404 </error-code> <lokasi> /index.html </location> </error-page>
A Kunin
65

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

import {provide} from 'angular2/angular2';
import {
  ROUTER_PROVIDERS,
  LocationStrategy,
  HashLocationStrategy
} from 'angular2/router';

Dan akhirnya, bootstrap semuanya bersama seperti itu

bootstrap(AppCmp, [
  ROUTER_PROVIDERS,
  provide(LocationStrategy, {useClass: HashLocationStrategy})
]);

Rute Anda akan muncul sebagai http: // localhost / # / route dan ketika Anda menyegarkan, itu akan dimuat ulang di tempat yang semestinya.

Semoga itu bisa membantu!

SimonHawesome
sumber
1
kode ini akan berfungsi dengan baik tetapi ada beberapa masalah dalam teknik ini dengan menggunakan ini #akan ditambahkan secara otomatis dalam URL. apakah ada solusi untuk menghapus # dari URL dengan menggunakan ini?
Pardeep Jain
Setuju, saya mencoba menerapkan "PathLocationStrategy" yang tercantum di sini , tetapi tidak berhasil. URL tanpa #akan optimal.
SimonHawesome
Ya saya juga mencoba hal yang sama dengan PathLocationStrategytetapi ini tidak berhasil untuk saya. baik saya menggunakan metode yang salah atau saya tidak tahu cara menggunakan PathLocationStrategy.
Pardeep Jain
1
Ini tidak berfungsi untuk saya di RC1. Mengimpor LocationStrategy, HashLocationStrategy dari '@ angular / router' gagal.
infojolt
1
Maaf untuk kembali ke pertanyaan ini setelah lebih dari 1 tahun :) Tapi apakah HashLocationStrategy membantu tetap di jalur Router yang sama? Dalam kasus saya ketika saya me-refresh, saya akan diarahkan ke localhost / # / < rute default > yaitu rute default untuk halaman beranda. Bagaimana cara saya pergi ke rute saat ini pada awalnya saya ketika saya 'Refreshed'?
rajugaadu
47

Angular secara default menggunakan pushstate HTML5 ( PathLocationStrategydalam bahasa gaul Angular).
Anda memerlukan server yang memproses semua permintaan seperti yang diminta index.htmlatau Anda beralih ke HashLocationStrategy(dengan # di URL untuk rute) https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class. html

Lihat juga https://ngmilk.rocks/2015/03/09/angularjs-html5-mode-or-pretty-urls-on-apache-using-htaccess/

Untuk beralih HashLocationStrategymenggunakan

pembaruan untuk> = RC.5 dan 2.0.0 final

import {HashLocationStrategy, LocationStrategy} from '@angular/common';

@NgModule({
  declarations: [AppCmp], 
  bootstrap: [AppCmp],
  imports: [BrowserModule, routes],
  providers: [{provide: LocationStrategy, useClass: HashLocationStrategy}]
]);

atau lebih pendek dengan useHash

imports: [RouterModule.forRoot(ROUTER_CONFIG, {useHash: true}), ...

pastikan Anda memiliki semua impor yang diperlukan

Untuk router baru (RC.3)

<base href="."> 

dapat menyebabkan 404 juga.

Sebaliknya itu membutuhkan

<base href="/">

pembaruan untuk> = RC.x

bootstrap(AppCmp, [
  ROUTER_PROVIDERS,
  provide(LocationStrategy, {useClass: HashLocationStrategy})
  // or since RC.2
  {provide: LocationStrategy, useClass: HashLocationStrategy} 
]);

import {provide} from '@angular/core';
import {  
  PlatformLocation,  
  Location,  
  LocationStrategy,  
  HashLocationStrategy,  
  PathLocationStrategy,  
  APP_BASE_HREF}  
from '@angular/common';  

pembaruan untuk> = beta.16 Impor telah berubah

import {BrowserPlatformLocation} from '@angular/platform-browser';

import {provide} from 'angular2/core';
import {
  // PlatformLocation,
  // Location,
  LocationStrategy,
  HashLocationStrategy,
  // PathLocationStrategy,
  APP_BASE_HREF}
from 'angular2/router';
import {BrowserPlatformLocation} from 'angular2/src/router/location/browser_platform_location';

<beta.16

import {provide} from 'angular2/core';
import {
  HashLocationStrategy
  LocationStrategy,
  ROUTER_PROVIDERS,
} from 'angular2/router';

Lihat juga https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta16-2016-04-26 pemecahan-perubahan

Günter Zöchbauer
sumber
1
Terima kasih! tampaknya menyediakan telah pindah di bawah angular / core: import {supply} dari 'angular2 / core'
StrangeLoop
1
Sekadar diketahui: update for >= RC.x(RC.2) berfungsi dengan router 3.0.0-alpha.7, tetapi providedijelaskan sebagai sudah usang tanpa informasi tentang fungsi yang menggantikannya.
Mrusful
Gunakan{provide: SomeClass, useClass: OtherClass}
Günter Zöchbauer
2
Jawaban terbaru. Untuk versi terbaru dari sudut 2.4.1 saya punya <base href = "./">. Berubah menjadi <base href = "/"> menyelesaikan masalah yang saya miliki. Mungkin bermanfaat bagi seseorang.
Saiyaff Farouk
28

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.

Simon
sumber
7
jadi bagaimana cara memperbaikinya? bagaimana cara kami memetakan semua permintaan ke indeks utama secara default? apakah itu bergantung pada server?
Ayyash
1
Ya, Anda akan melakukan ini di server dengan kerangka web apa pun yang Anda gunakan. Alternatifnya adalah dengan menggunakan HashLocationStrategy seperti yang dijelaskan di bawah ini.
Simon
Anda akan memuat ulang angular SPA di setiap rute yang tidak ada. Apakah ini cara penanganannya?
Gary
Ini hanya dimuat ulang jika pengguna mengklik menyegarkan di browser, bukan ketika pengguna mengubah rute melalui UI. Tidak benar-benar ada jalan lain saat memuat ulang pengguna.
Wallace Howery
19

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 routefile.

Yang kami inginkan adalah server mengembalikan index.htmlfile yang berisi aplikasi satu halaman. Maka router harus menendang dan memproses /routeurl 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:

function sendSpaFileIfUnmatched(req,res) {
    res.sendFile("index.html", { root: '.' });
}

Dan kemudian daftarkan di bagian paling akhir rantai middleware:

app.use(sendSpaFileIfUnmatched);

Ini akan berfungsi index.htmlalih-alih mengembalikan 404, router akan menendang dan semuanya akan berfungsi seperti yang diharapkan.

Universitas Angular
sumber
Ini persis masalah saya. Jika Anda menggunakan NGINX, jawaban ini membantu mengatasinya: stackoverflow.com/questions/7027636/…
Nathan
Apakah ada tutorial tentang cara melakukan ini untuk java? Terima kasih.
000000000000000000000
13

Pastikan ini ditempatkan di elemen kepala index.html Anda:

<base href="https://stackoverflow.com/">

The Contoh di Angular2 Routing & Navigasi menggunakan dokumentasi kode berikut di kepala bukan (mereka menjelaskan mengapa pada contoh catatan hidup dari dokumentasi):

<script>document.write('<base href="' + document.location + '" />');</script>

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.

pengguna2263572
sumber
Terima kasih telah berbagi ini. Mari kita perjelas, itu hanya bekerja untuk saya ketika saya meletakkan <base href = "/"> langsung setelah memuat semua css di <head>, dan sebelum memuat file APAPUN. Saya harap ini membantu siapa pun
wmehanna
saya punya <base href = "./"> di index.html lalu dihapus '.' dari href dan itu berhasil ..
Saurabh Solanki
10

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:

RouterModule.forRoot(routes, { useHash: true })

Dari pada:

RouterModule.forRoot(routes)

Dengan HashLocationStrategy url Anda akan menjadi seperti:

http://server:port/#/path
felipecrp
sumber
Terima kasih! ini membantu, Tapi saya tidak mau #dari url, dapatkah kita menghapus ini?
Hidayt Rahman
7

Saya memiliki masalah yang sama dengan menggunakan webpack-dev-server. Saya harus menambahkan opsi devServer ke paket web saya.

Larutan:

// in webpack
devServer: {
    historyApiFallback: true,
    stats: 'minimal'
}
angmerica
sumber
Jenis sihir voodoo: p Untuk info lebih lanjut, lihat: webpack.github.io/docs/…
Jissay
7

Jika Anda menggunakan Apache atau Nginx sebagai server Anda harus membuat .htaccess(jika tidak dibuat sebelumnya) dan "Aktif" RewriteEngine

RewriteEngine On  
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
RewriteRule ^ /index.html
Rakesh Roy
sumber
Tidak mendapatkan pertanyaan Anda, metode ini diuji pada server Apache dan Nginx ( nginx.com )
Rakesh Roy
1
Ini hanya untuk Apache; Format konfigurasi nginx sama sekali berbeda.
Franklin Yu
5

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:

ErrorDocument 404 /index.html

Sehingga kesalahan 404 akan dialihkan ke index.html, yang diinginkan oleh routing angular2.

Seluruh contoh file vhost:

<VirtualHost *:80>
  ServerName fenz.niwa.local
  DirectoryIndex index.html
  ErrorDocument 404 /index.html

  DocumentRoot "/Users/zhoum/Documents/workspace/fire/fire_service/dist"
  ErrorLog /Users/zhoum/Documents/workspace/fire/fire_service/logs/fenz.error.log
  CustomLog /Users/zhoum/Documents/workspace/fire/fire_service/logs/fenz.access.log combined

  <Directory "/Users/zhoum/Documents/workspace/fire/fire_service/dist">
    AllowOverride All
    Options Indexes FollowSymLinks
    #Order allow,deny
    #Allow from All
    Require all granted
  </Directory>

  Header set Access-Control-Allow-Origin "*"
  Header set Access-Control-Allow-Methods "GET, POST"
  Header set Access-Control-Allow-Credentials "true"
  Header set Access-Control-Allow-Headers "Accept-Encoding"
</VirtualHost>

Tidak peduli server apa yang Anda gunakan, saya pikir intinya adalah mencari cara untuk mengkonfigurasi server untuk mengarahkan 404 ke index.html Anda.

Willie Z
sumber
4

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.

@RouteConfig([
  { path: '/**', redirectTo: ['MycmpnameCmp'] }, 
   ...
  }
])

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.

Gary
sumber
4

untuk perbaikan cepat sudut 5, edit app.module.ts dan tambahkan {useHash:true}setelah appRoutes.

@NgModule(
{
  imports:[RouterModule.forRoot(appRoutes,{useHash:true})]
})
Adesh Shah
sumber
3

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.

<configuration>
<system.webServer>
<rewrite>
    <rules>
    <rule name="Angular Routes" stopProcessing="true">
        <match url=".*" />
        <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="/" />
    </rule>
    </rules>
</rewrite>
</system.webServer>
</configuration>

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.

"assets": [
    "assets",
    "favicon.ico",
    "Web.config"
  ],

3) Sekarang Anda dapat membangun solusi untuk produksi menggunakan

ng build --prod

Ini akan membuat folder dist. File di dalam folder dist siap untuk ditempatkan dengan mode apa pun.

Malatesh Patil
sumber
Solusi terbaik, dapat menemukan detail dari sudut: angular.io/guide/deployment#fallback Saat membuat file web.config jangan lupa menambahkan tag <configuration> </configuration>. Terima kasih atas jawabannya, Malatesh.
Palash Roy
3

Anda dapat menggunakan solusi ini untuk aplikasi rata-rata, saya menggunakan ejs sebagai view engine:

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.engine('html', require('ejs').renderFile);
app.use(function (req, res, next) {
    return res.render('index.html');
});

dan juga diatur dalam angular-cli.json

"apps": [
    {
      "root": "src",
      "outDir": "views",

itu akan berfungsi dengan baik alih-alih

app.get('*', function (req, res, next) {
    res.sendFile('dist/index.html', { root: __dirname });
 });

itu menciptakan masalah dengan mendapatkan panggilan db dan mengembalikan index.html

Shoaib Qureshi
sumber
1
Ini bekerja dengan sempurna pada Oktober 2017 untuk aplikasi tumpukan MEAN.
Tim Mindsect
2

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/ )

Import-WebAdministration
# Grab the 404 handler and update it to redirect to index.html.
$redirect = Get-WebConfiguration -filter "/system.WebServer/httperrors/error[@statusCode='404']" -PSPath IIS:\Sites\LIS 
$redirect.path = "/index.html"
$redirect.responseMode = 1
# shove the updated config back into IIS
Set-WebConfiguration -filter "/system.WebServer/httperrors/error[@statusCode='404']" -PSPath IIS:\Sites\LIS -value $redirect

Ini mengalihkan 404 ke file /index.html sesuai saran di Angular 2 docs (tautan di atas).

Jim Hume
sumber
2

Anda dapat mencoba di bawah ini. Ini bekerja untuk saya!

main.component.ts

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';

...
export class MainComponent implements OnInit {
    constructor(private router: Router) {
        let path: string = window.location.hash;
        if (path && path.length > 0) {
            this.router.navigate([path.substr(2)]);
        }
    }

    public ngOnInit() { }
}

Anda selanjutnya dapat meningkatkan path.substr (2) untuk dibagi menjadi parameter router. Saya menggunakan sudut 2.4.9

kaifeong
sumber
Ini sangat membantu untuk menangani penyegaran peramban! Untuk sudut 5, saya harus memodifikasinya sedikit untuk menggunakan window.location.pathname, dan membandingkan nilai itu dengan jalur yang diharapkan.
Wallace Howery
2

i Cukup menambahkan .htaccess di root.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
    RewriteRule ^ - [L]
    RewriteRule ^ ./index.html
</IfModule>

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.

hadiya vipul
sumber
1

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:

<configuration>
    <location path="." inheritInChildApplications="false">
    <system.webServer>
        <defaultDocument enabled="true">
            <files>
                <add value="index.html" />
            </files>
        </defaultDocument>
    </system.webServer>
  </location>
</configuration>
Devin McQueeney
sumber
1

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.

Lievno
sumber
1

Jika Anda ingin menggunakan PathLocationStrategy:

  • Konfigurasi wildfly:
    • Buat file undertow-handlers.conf untuk ditempatkan di WEB-INF
    • Konten: (kecualikan titik akhir istirahat Anda!)
      • regex ['(. / overview / ?. ? $)'] dan bukan regex ['(. / endpoints. )'] -> tulis ulang ['/ index.html']
      • regex ['(. / deployments / ?. ? $)'] dan bukan regex ['(. / endpoints. )'] -> tulis ulang ['/ index.html']

Aplikasi satu halaman dengan Java EE / Wildfly: konfigurasi sisi server

nkeymeulen
sumber
1

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.

TimTheEnchanter
sumber
1

Tambahkan impor:

import { HashLocationStrategy, LocationStrategy } from '@angular/common';

Dan di penyedia NgModule, tambahkan:

providers: [{provide: LocationStrategy, useClass: HashLocationStrategy}]

Di utama index.html File Aplikasi mengubah basis href ./index.htmldari/

Aplikasi ketika digunakan di server mana pun akan memberikan url nyata untuk halaman yang dapat diakses dari aplikasi eksternal apa pun.

Debargho24
sumber
1

Hanya menambahkan .htaccess di root diselesaikan 404 sambil menyegarkan halaman dalam sudut 4 apache2.

<IfModule mod_rewrite.c>
    RewriteEngine on

    # Don't rewrite files or directories
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]

    # Rewrite everything else to index.html
    # to allow html5 state links
    RewriteRule ^ index.html [L]
</IfModule>
a_k_v
sumber
1

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:

<error-page>
     <error-code>404</error-code>
     <location>/index.html</location>
</error-page>

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.

<? xml version='1.0' encoding='utf-8'?>
<Context>
  <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
</Context>

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:

  RewriteCond %{SERVLET_PATH} !-f
  RewriteRule ^/(.*)$ /index.html [L]
karan khanna
sumber
0

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

<!doctype html>
<html>
    <head>
        <script type="text/javascript">
            window.location.href = "http://" + document.location.host;
        </script>
    </head>
</html>
don625
sumber
0

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.

 app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
            routes.MapSpaFallbackRoute("spa-fallback", new { controller = "Home", action = "Index" });
        });
Divyanshu-systematix
sumber
0

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 --prodjika 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 .htaccessfile direktori aplikasi sudut Anda), Anda harus menambahkanErrorDocument 404 /404.php

404.php akan dimulai dengan kode berikut:

<?php
$angular='/dist/';
if( substr($_SERVER['REQUEST_URI'], 0, strlen($angular)) == $angular ){
    $index = $_SERVER['DOCUMENT_ROOT'] . $angular . "index.html";
    http_response_code(200);
    include $index;
    die;
}

// NOT ANGULAR...
echo "<h1>Not found.</h1>"

di mana $angularnilai disimpan di HREF sudut Anda index.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:

  • Mencoba melakukan hal yang sama dengan 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".
  • Hanya mengarahkan menggunakan ErrorDocument 404 /dist/index.htmlkarya tetapi Apache masih merespons dengan kode kesalahan 404 (yang buruk untuk perayap).
William R
sumber
0

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 HashLocationStrategyyang disediakan dengan Angular 2.

Tapi itu datang dengan serangkaian masalah sendiri #di url itu benar-benar buruk membuat url terlihat aneh seperti ini https://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.

Anda harus mulai dengan menambahkan file 404.html ke repo halaman gh Anda yang berisi dokumen HTML kosong di dalamnya - tetapi total dokumen Anda harus lebih dari 512 byte (dijelaskan di bawah). Selanjutnya masukkan markup berikut di elemen kepala halaman 404.html Anda:

<script>
  sessionStorage.redirect = location.href;
</script>
<meta http-equiv="refresh" content="0;URL='/REPO_NAME_HERE'"></meta>

Kode ini menetapkan URL pintu masuk yang dicoba ke variabel pada objek sessionStorage standar dan segera mengalihkan ke halaman index.html proyek Anda menggunakan tag meta refresh. Jika Anda melakukan situs Github Organization, jangan letakkan nama repo di teks replacer atribut content, lakukan saja ini: content = "0; URL = '/'"

Untuk mengambil dan mengembalikan URL yang awalnya dinavigasi oleh pengguna, Anda harus menambahkan tag skrip berikut ke kepala halaman index.html Anda sebelum JavaScript lain bertindak pada keadaan halaman saat ini:

<script>
  (function(){
    var redirect = sessionStorage.redirect;
    delete sessionStorage.redirect;
    if (redirect && redirect != location.href) {
      history.replaceState(null, null, redirect);
    }
  })();
</script>

Sedikit JavaScript ini mengambil URL yang kami cached di sessionStorage pada halaman 404.html dan menggantikan entri riwayat saat ini dengannya.

Referensi backalleycoder Berkat @ Daniel untuk solusi ini.

Sekarang URL di atas berubah menjadi https://rahulrsingh09.github.io/AngularConcepts/faq

Rahul Singh
sumber
0

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.

@Controller         ////don't use RestController or it will just send back the string "index.html"
public class Redirect {

    private static final Logger logger = LoggerFactory.getLogger(Redirect.class);

    @RequestMapping(value = {"comma", "sep", "list", "of", "routes"})
    public String redirectToIndex(HttpServletRequest request) {
        logger.warn("Redirect api called for URL {}. Sending index.html back instead. This will happen on a page refresh or reload when the page is on an Angular route", request.getRequestURL());
        return "/index.html";
    }
}
Lee Willis
sumber
0

Jika Anda menggunakan Apache atau Nginx sebagai server, Anda harus membuat .htaccess

<IfModule mime_module>
      AddHandler application/x-httpd-ea-php72 .php .php7 .phtml
    </IfModule>
    # php -- END cPanel-generated handler, do not edit

    <IfModule mod_rewrite.c>
        RewriteEngine on

        # Don't rewrite files or directories
        RewriteCond %{REQUEST_FILENAME} -f [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^ - [L]

        # Rewrite everything else to index.html
        # to allow html5 state links
        RewriteRule ^ index.html [L]
    </IfModule>
Mukesh Kumar Bijarniya
sumber