2013-03-13 17 views
6

Próbuję skonfigurować Apache 2.2 z AngularJS z prawie dokładną strukturą jak ta z poniższego zamkniętego pytania.Reguły przepisywania Apache nie są stosowane dla angularjs

rewrite rules for apache 2 to use with angular js

Chciałbym przekierować wszystkie żądania do APP/index.html wyjątkiem żądań do/API.

Moja struktura katalogów jest jak następuje

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

Próbuję zastosuj te reguły przekierowania w pliku httpd-vhosts jako taki, który został zaksięgowany jako poprawna odpowiedź na pytanie: https://stackoverflow.com/a/15284848/671095.

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

Jednak gdy próbuję odwiedzić/w przeglądarce, wyświetlany jest pusty ekran. Jeśli przejdę do /app/index.html w przeglądarce, ale mogę przeglądać stronę html w przeglądarce, ale nie można uzyskać dostępu do żadnego z css.or js i zwraca 404.

I've going going O to chodzi, co wydaje się prostą rzeczą do zrobienia jako przepisanie apache.

Każda pomoc byłaby bardzo cenna.

Odpowiedz

2

Miałem ten sam problem. Ale jestem ignorantem w mod_rewrite, więc musiałem dla Google dużo. znalazłem rozwiązanie w tym e-mail:

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

Więc myślę, że .htaccess powinien wyglądać następująco:

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] 

Zawiadomienie (.*) i #/$1

Uwaga: Należy używaj bezwzględnych ścieżek w twoich plikach CSS, JS itp., jeśli nie otrzymasz błędu:

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

+0

Zastosowałem te reguły do ​​pliku httpd-vhosts, ale kiedy próbuję uzyskać dostęp do 'mywebsite.com', to nie przechodzi ono do pliku index.html także teraz, kiedy mam dostęp do' mywebsite.com/app/'Jestem prezentowane z 404 w przeglądarce – matthew

+0

Użyłem twojego kodu i widzę komunikat "Wewnętrzny błąd serwera". Wszelkie pomysły, jak to naprawić? – Devner

13

Jest to teraz znacznie łatwiejsze w Apache 2.2.16 lub nowszym przy użyciu dyrektywy FallbackResource.

FallbackResource /app/index.html 

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

zależności od tego jak jesteś spedycja dostęp do API może trzeba również wykorzystać załącznik wyłączyć zasób awaryjnej na specjalnie na prośby API (2.2.24+).

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

Działa jak urok z apache 2.4.x! –

11

This roboty dla mnie:

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

Wystarczy, że dodasz do tego komentarza, jeśli twoja aplikacja Angular nie znajduje się w katalogu głównym hosta, tzn. Zawartość znajduje się w katalogu takim jak http://example.com/moo/, musisz dodać odpowiedni tag '' . Na przykład http://example.com/moo/ twój tag musi być ' - to znaczy, że twoje zasoby i szablony ładują się poprawnie – BahamutWC

+0

@BahamutWC: Używanie znacznik podstawowy jest zniechęcany; http://docs.angularjs.org/guide/dev_guide.services.$location – Daan

+1

@Dan jest odradzany, o ile Angular zaleca, aby podawać go z głównego dokumentu. Jednak jeśli nie możesz z jakiegokolwiek powodu, musisz użyć znacznika ''. – BahamutWC

1

nie wiem, czy nadal masz ten problem, ale miałem takie same objawy z angularjs i Apache 2.

Mój problem było tak naprawdę, że używałem IE i automatycznie pojawiało się w trybie zgodności. Użyłem poniższej linii w moim kodzie HTML i zadziałało.

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

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