2013-03-13 14 views
6

Sto provando ad installare apache 2.2 con AngularJS con una struttura quasi esatta come quella della seguente domanda chiusa.Regole di riscrittura di Apache non applicate per angularjs

rewrite rules for apache 2 to use with angular js

Vorrei reindirizzare tutte le richieste per app/index.html ad eccezione di richieste a/api.

La mia struttura di directory è seguita

  • /
  • /app
  • /app/index.html
  • /app/css
  • /app/js
  • /api

Sto provando a applica queste regole di reindirizzamento nel file httpd-vhosts come tale, che è stato pubblicato come risposta corretta https://stackoverflow.com/a/15284848/671095 alla domanda.

<VirtualHost *:80> 
ServerName www.test.com 
DocumentRoot "C:/websites/test" 
Alias /CFIDE "C:/websites/CFIDE" 

RewriteEngine On 

# if a directory or a file exists, use it directly 
RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_URI} !/api 

# otherwise forward it to index.html 
RewriteRule ^.*$ - [NC,L] 
RewriteRule ^app/. /app/index.html [NC,L] 

</VirtualHost> 

Tuttavia quando provo visita/nel browser mi viene presentato uno schermo vuoto. Se accedo a /app/index.html nel browser tuttavia sono in grado di visualizzare la pagina html nel mio browser ma nessuno dei css.or js è accessibile e restituisce un 404.

Sto andando pazzo su questo che sembra una cosa semplice da realizzare come una riscrittura da apache.

Qualsiasi aiuto sarebbe molto apprezzato

risposta

2

Ho avuto lo stesso problema. Ma io sono ignorante in mod_rewrite così ho dovuto molto a Google. Ho trovato la soluzione in questa e-mail:

https://groups.google.com/d/msg/angular/GmNiNVyvonk/mmffPbIcnRoJ

Quindi penso che il tuo .htaccess dovrebbe apparire come segue:

Options +FollowSymLinks 
IndexIgnore */* 

RewriteEngine on 

# if a directory or a file exists, use it directly 
RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_URI} !/api 
RewriteRule ^.*$ - [NC,L] 

# otherwise forward it to index.html 
RewriteRule ^app/(.*) /app/#/$1 [NC,L] 

Avviso il (.*) e la #/$1

Nota: è necessario usa percorsi assoluti nel tuo include CSS, JS, ecc. se non hai intenzione di ottenere l'errore:

resource interpreted as script but transferred with mime type text/html

+0

Ho applicato queste regole al file httpd-vhosts ma quando provo ad accedere a 'mywebsite.com' non passa al file index.html anche ora quando accedo a' mywebsite.com/app/'I am presentato con un 404 nel browser – matthew

+0

ho usato il tuo codice e vedo il messaggio "Internal Server Error". Qualche idea su come risolvere questo problema? – Devner

13

Questo è ora molto più semplice in Apache 2.2.16+ utilizzando la direttiva FallbackResource.

FallbackResource /app/index.html 

http://httpd.apache.org/docs/2.2/mod/mod_dir.html#fallbackresource

A seconda di come si sta inoltrare l'accesso al vostro API potrebbe essere necessario sfruttare anche la custodia per disabilitare le risorse di fallback sul particolare sulle richieste API (2.2.24+).

<Directory /api> 
    FallbackResource disabled 
</Directory> 
+0

Funziona come un fascino con apache 2.4.x! –

11

This funziona per me:

<ifModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !index 
    RewriteRule (.*) index.html [L] 
</ifModule> 
+0

Giusto per aggiungere a questo commento, se la tua app Angolare non si trova nella radice dell'host, cioè i contenuti vivono in una directory come http://example.com/moo/, è necessario aggiungere il tag ' appropriato ' . Per l'esempio di http://example.com/moo/, il tag deve essere "' - in questo modo le risorse e i modelli vengono caricati correttamente – BahamutWC

+0

@BahamutWC: Uso di il tag base è scoraggiato; http://docs.angularjs.org/guide/dev_guide.services.$location – Daan

+1

@Daan è scoraggiato solo per quanto Angular consiglia di servirlo dal documento root. Tuttavia, se non è possibile per qualsiasi motivo, è necessario utilizzare il tag ''. – BahamutWC

1

Non so se si continua ad avere questo problema, ma ho avuto gli stessi sintomi con AngularJS e Apache 2.

Il mio problema era in realtà che stavo usando IE e che veniva automaticamente in modalità compatibilità. Ho usato la riga qui sotto nel mio HTML e ha funzionato.

<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 

ulteriormente descritto qui: < What does <meta http-equiv="X-UA-Compatible" content="IE=edge"> do?>.

Problemi correlati