2015-09-01 13 views
14

Pracuję nad aplikacją internetową (Angular + Rails), która obsługuje zasoby serwera poprzez CDN CloudFront. Aplikacja jest obsługiwana przez nginx, który jest poprawnie skonfigurowany, aby ustawić nagłówek "Access-Control-Allow-Origin". CloudFront jest skonfigurowany do przekazywania nagłówka.Brak kontroli dostępu w przypadku braku odpowiedzi przy pierwszej odpowiedzi

Problem polega na tym, że w pierwszej odpowiedzi na szablon kątowy brakuje nagłówka, ale jest on poprawnie obecny w kolejnych odpowiedziach (jeśli odświeżam stronę).

Jeśli na przykład wyczyściłem całą historię i pamięć podręczną w przeglądarce Chrome i odwiedzę stronę, odpowiedź na plik szablonu nie będzie zawierać nagłówka "Access-Control-Allow-Origin". Jeśli odświeżę stronę, odpowiedź na szablon będzie miała nagłówek.

Zauważyłem, że jeśli wyczyści całą historię i pamięć podręczną, ale nie ciasteczka, nadal działa poprawnie.

Zachowuje się podobnie w Firefoksie. Jeśli wyczyści całą historię i pamięć podręczną, nie działa przy pierwszej odpowiedzi, ale działa poprawnie w następnych odpowiedziach. Po wyczyszczeniu całej historii i pamięci podręcznej, ale bez plików cookie, nadal działa poprawnie, w przeciwieństwie do Chrome.

Ponadto, jeśli otworzę narzędzia programistyczne i wyłączę pamięć podręczną w Firefoksie, w każdej odpowiedzi brakuje nagłówka.

Czy wiesz, jaki może być problem lub gdzie powinienem szukać dalej?

Dzięki.

+0

spróbuj JSONP dla żądań cors –

+2

Pierwszym żądaniem między domenami jest OPCJE, nagłówki serwera shoud return Access-Control-Allow-Methods: POST, GET, ** OPCJE ** –

+0

Z jakim problemem masz do czynienia? Dla każdego żądania, żądanie OPTIONS jest wykonywane jako pierwsze, jeśli to się powiedzie, wówczas zostanie wykonane rzeczywiste żądanie. Czy napotykasz problem tam lub w jakiejkolwiek innej prośbie? Czy ma to wpływ na twoją aplikację? –

Odpowiedz

6

"Access-Control-Allow-Origin" to nagłówek odpowiedzi, a nie nagłówek żądania. Jest zwracany przez serwer HTTP, gdy klient HTTP wysyła żądanie za pomocą metody OPTION. Na przykład ajax API w przeglądarkach wysyła żądanie OPTION przed wypróbowaniem żądania POST, gdy docelowy URL nie jest bieżącym adresem URL strony (patrz problem dzielenia się źródłami krzyżowymi). To żądanie OPTION zawiera nagłówek "Origin", który przechowuje bieżącą stronę początkową adresu URL (schemat + domena). API Ajax wyśle ​​żądanie POST tylko wtedy, gdy odpowiedź zawiera nagłówek "Access-Control-Allow-Origin" z adresem URL odpowiadającym stronie głównej.

Musisz martwić się o takie nagłówki, jeśli chcesz uzyskać dostęp do zawartości dynamicznej z innego serwera niż serwer obsługujący bieżącą stronę. To nie wygląda na twoją sprawę.

Aby uzyskać więcej informacji na temat CORS, zobacz tę stronę Wikipedia: https://en.wikipedia.org/wiki/Cross-origin_resource_sharing

+0

. W końcu rozwiązałem ten problem, używając wbudowanych szablonów z Angular, ponieważ widziałem, że większość programistów woli to robić. Jednak ta odpowiedź była najbardziej pomocna w nauce więcej o CORS. – Strika

0

Jeśli istnieje również angularjs tag, pozwól mi sugerować, że nie można załadować szablony html ale kompilować je wszystkie do jednego pliku JS (na przykład z html2js wtyczka gruntu)