2013-03-07 17 views
16

Oczywiście istnieje wiele modów do przepisywania dyskusji i odpowiedzi w całym Internecie. Jednak mam trudności z ich uchwyceniem. Pomyślałem, że zapytam tutaj.Reguły przepisywania dla Apache 2 do użycia z kątowym js

Pytam reguł przepisywania robić to, co Andy Joslin wyjaśnił w komentarzach tutaj: https://stackoverflow.com/a/11100438

To moja obecna struktura reż u podstaw example.com

  • app/
  • app/index.html ("root" aplikacji kątowej js)
  • api (To będzie aplikacja symfony 2, która jest używana do 'api'. Będę wysyłać zapytania ajax do iz stąd z kątowe.)

Chciałbym przekierować wszystkie żądania do app/index.html, z wyjątkiem żądań do/api.

Na przykład:

http://example.com/categories/electronics/ipod rzeczywiście byłoby jak pójście do http://example.com/app/index.html/categories/electronics/ipod

Chciałbym za część app/index.html być jednak ukryty.

Następnie będzie wyjątek dla żądań do http://example.com/api, ponieważ będę musiał wykonać żądania ajax do tych ścieżek URL.

Dzięki za wszelką pomoc/wskazówki.

+7

Nie sądzę, aby to pytanie zostało zamknięte. Dotyczy to programów angularjs i urr -writer. Oba tematy są istotne. – elviejo79

+0

Nie ma sensu, że jest to oznaczone jako "wyłączony temat". To nie jest temat. –

+0

@casperOne, otwórz to z powrotem. –

Odpowiedz

13

Oto coś, aby można było (to umieścić wewnątrz pliku /.htaccess):

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 

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

Dzięki, wykorzystam to, co mogę z tego. Pracuję teraz nad popularnym samouczkiem dotyczącym przeróbek. Myślę jednak, że to, co chcę zrobić, to nie służyć plikowi tylko dlatego, że istnieje. Problem polega na tym, że ktoś mógłby zażądać tego, co kątowe nazywa "częściowym" plikiem i to by mu służyło, itp. Przekieruję wszystko do app/index.html Wtedy jawnie pominę niektóre katalogi, takie jak css/img/ –

+1

Ten kod prawie rozwiązał mój problem ... Musiałem trochę zmienić regułę aplikacji, zostawiłem działający przykład na temat tej odpowiedzi: http://stackoverflow.com/a/15415902/54848 – elviejo79

+0

Nie działa dla mnie = (http://take.ms/DyLaQ – fdrv

18

Zaakceptowanych odpowiedź na to pytanie jest nieaktualne. Możesz teraz użyć dyrektywy FallbackResource w swoim pliku conf w Apache 2.2.16+.

FallbackResource /app/index.html 

Jeśli chcesz dyrektywa FallbackResource ignorować "/ API" trasy:

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

Cool dyrektywy.Jak jednak, w jaki sposób można to wykorzystać ignorując żądania do "/ api"? Jakie było moje oryginalne pytanie. –

+1

Może to zrobić, jeśli ustawisz go tak, by ignorował trasy/api. Edytowałem odpowiedź, aby to odzwierciedlić. –

0

Problem z tą odpowiedzią jest to, że nadal chcesz błędy 404 dla file-not-found. W zależności od tego, jak dana osoba buduje swoją aplikację front-end, jest ona bardzo powszechna, gdy ludzie mają css lub inne pliki zwracają 404, zwłaszcza jeśli budują większe dynamiczne aplikacje lub outsourcing prac frontowych. Ponadto trasy kątowe zwykle nie są powiązane z niczym w systemie plików. Powyższe może działać, jeśli zawęzisz je do jednego katalogu. Na przykład często użyję wspólnego przedrostka dla wszystkich tras kątowych, które nie są związane z układem systemu plików (/ ajs /). Jeśli możesz to zrobić, to będzie to miało więcej sensu, ale to nie działa dla mnie. Używanie wspólnego przedrostka również sprawia, że ​​reguły backendu są znacznie prostsze bez względu na backend. Na przykład możesz skonfigurować prosty kontroler przesyłania dalej do serwera, jeśli nie korzystasz z odwrotnego proxy. I sprawia, że ​​modelowanie reguł przepisywania apache jest proste.Na przykład:

RewriteEngine On 
RewriteRule ^/ajs/(.+)$ /index.html 

To powiedziawszy, nie widziałem sposobu katalog/awaryjnej wcześniej, więc jestem zainteresowany, aby zbadać go, gdy tylko przepisać potrzebne jest do kątowego w przód. Dzięki!

0

Jest to niewielka odmiana i opracowanie doskonałej odpowiedzi Scotta Fergusona. Ułatwiam korzystanie z dyrektywy <Location> niż <Directory>. Dyrektywa <Directory> przyjmuje bezwzględną nazwę ścieżki, która może być różna na różnych komputerach.

Załóżmy, że Twoja aplikacja Angular aplikacji index.html jest w katalogu my-app/index.html w katalogu głównym serwera WWW. I chcesz uzyskać dostęp do aplikacji za pomocą http://localhost/my-app.

Przede wszystkim upewnij się, że twój podstawowy href to "/ my-app /". Następnie w httpd.conf plików dodatek:

<Location "/my-app"> 
    FallbackResource /my-app/index.html 
</Location> 

Spowoduje Apache załadować index.html jeśli dowolny zasób pod /my-app/ nie można znaleźć.

Jeśli wywołujesz API pod tą samą ścieżką, na przykład /my-app/api, prawdopodobnie nie powinieneś stosować reguły FallbackResource dla tych połączeń. Dodaj więc:

<Location "/my-app/api"> 
    FallbackResource disabled 
</Location>