reindirizzamento htaccess per rotte angolari

Ho un’applicazione angular con diversi percorsi, come ad esempio:

site.com/ site.com/page site.com/page/4 

Utilizzando la modalità di routing html5 di angular, questi si risolvono correttamente quando si fa clic su collegamenti dall’interno dell’applicazione, ma naturalmente si verificano 404 errori quando si esegue un aggiornamento. Per risolvere questo problema, ho provato a implementare una riscrittura htaccess di base.

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_METHOD} !OPTIONS RewriteRule ^(.*)$ index.html [L] 

Questo funziona per le richieste angolari, tuttavia quando provo a caricare script o effettuare chiamate ajax all’interno del mio dominio, ad esempio:

  

Questo script non viene caricato: la richiesta viene reindirizzata e tenta di caricare la pagina index.html come il .htaccess pensa di dover redirect la richiesta, non sapendo che questo file esiste e dovrebbe caricare il file anziché il reindirizzamento.

C’è un modo in cui posso avere l’htaccess redirect la richiesta a index.html (con i parametri di visualizzazione) solo se non esiste un file effettivo che dovrebbe risolvere?

Usa uno snippet come:

 RewriteEngine on RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^(.*) /index.html [NC,L] 

Questo salterà alla risorsa effettiva se ce n’è una e a index.html per tutte le rotte di AngularJS.

C’è un problema se il file del modello di directive richiesto dall’app, ma il file è mancante . In alcuni casi ha causato l’app richiesta più file di script nell’index.html.

dovremmo inviare una risposta 404 invece del file index.html se il file non esiste. Quindi aggiungo un semplice modello regex per identificare la richiesta di file mancanti.

 RewriteEngine On # If an existing asset or directory is requested go to it as it is RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR] RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d RewriteRule ^ - [L] # If the requested pattern is file and file doesn't exist, send 404 RewriteCond %{REQUEST_URI} ^(\/[a-z_\-\s0-9\.]+)+\.[a-zA-Z]{2,4}$ RewriteRule ^ - [L,R=404] # otherwise use history router RewriteRule ^ /index.html 

La soluzione di un povero uomo (non usando mod_rewrite):

 ErrorDocument 404 /index.html 

Fornirò un altro file htaccess dettagliato nel caso in cui sia necessario:

  • Considerare la baseUrl e il file di indice predefinito
  • Rimuovi la barra iniziale per gestire: params

Ecco il mio htaccess, molto vicino, ma più specifico:

 DirectoryIndex index.html RewriteEngine on RewriteBase /subDir RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^(.*) index.html [NC,L] 

Dai un’occhiata a questo link: https://stackoverflow.com/a/49455101/5899936 Crea il file .htaccess nella cartella principale e pasi nel .htaccess

   RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L]  

Nel mio caso creo il file .htaccess come di seguito

 RewriteEngine on RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^(.*) ./index.html [NC,L] 

appena aggiunto . prima di /index.html e aggiungi quel file nel mio dominio come https://example.com/subfolder e funziona bene