2012-08-27 7 views
12

Próbuję uzyskać działanie AJAX między dwiema subdomenami.Włączono CORS w Apache, ale AJAX nie działa (chrome mówi, że pochodzenie nie jest dozwolone)

rails.mydomain.com i mydomain.com

w Apache, w pliku/etc/apache2/sites-available/Mam plik rails.mydomain.com:

<VirtualHost *:80> 
    Header add Access-Control-Allow-Origin "http://www.mydomain.com" 
    Header add Access-Control-Allow-Origin "http://www.dev-mydomain.com" 
</VirtualHost> 

Jednak ilekroć Próbuję wykonać proste żądanie testu ajax z http://www.dev-mydomain.com, w Chrome otrzymam: "XMLHttpRequest nie może załadować http://rails.mydomain.com/directory. Pochodzenie http://www.dev-mydomain.com jest niedozwolone przez Access-Control-Allow-Origin."

Ktoś wie, czego mi brakuje?

+1

wyjazdu [Access-C wiele domen początkowych ontrol-Allow-Origin] (http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains) –

+1

Ok, więc widziałem to wcześniej, ale poszedłem za odpowiedź o wykonaniu dwóch instrukcji "dodaj do nagłówka". Usunąłem drugą instrukcję dodawania i mam ustawiony tylko jeden nagłówek i działa, jednak w końcu będę musiał mieć dwa początki ... powinienem po prostu zrobić dwie set instrukcje, lub które rozwiązanie z tego posta jest najlepszą metodą –

+0

, zgniata z więcej niż jednym ustawieniem. google musi naprawić to jak najszybciej. nie wymyślili ajaxa? –

Odpowiedz

0

Użyłem rack-cors do pewnego sukcesu, bardzo proste, aby dodać robiąc pochodzenia przekrój ajax ...

2

można spróbować to proszę?

Aby Gemfile

gem "rack-cors", "~> 0.2.7" 

Aby config/environment.rb

config.middleware.use Rack::Cors do |requests| 
    requests.allow do |allow| 
    allow.origins '*' 
    allow.resource '*', headers: :any, methods: [:get, :post, :put, :delete, :options] 
    end 
end 

Nie zapomnij restartu serwera. To powinna być praca.

+1

Czy to nie czyni serwera mniej bezpiecznym. – mindmyweb

3

Jak wskazuje link Dahazera, najlepiej postawić pojedynczy nagłówek Access-Control-Allow-Origin. Z pewnością nie nadaje się do produkcji, ale możesz tylko powtórzyć echo nagłówka Origin, gdy jesteś w trybie deweloperskim.

Jeśli nadal masz problem, prawdopodobnie nie ustawisz wystarczająco dużo nagłówków CORS w odpowiedzi. W moim doświadczeniu robi przekrój ajax domeny w Chrome (nie przy użyciu jQuery umysł), potrzebowałem już także ustawić następujący nagłówek:

Access-Control-Allow-Headers : X-Requested-With,Content-Type 

Biorąc używałem metody HTTP innych niż POST i GET było również konieczne dla mnie, aby ustawić

Access-Control-Allow-Methods : GET,PUT,POST,DELETE 

jednak przede wszystkim polecam czytanie HTML5 samouczek CORS, zwłaszcza sekcję CORS on the server. Powinien dać ci dobry pomysł na różne sposoby konfigurowania CORS, czy to na serwerze, czy na kliencie (w twoim przypadku opcje konfiguracyjne ajax jquery), na podstawie twojego konkretnego przypadku użycia.

2

Niedawno miałem ten problem. W Apache ustawiłem Access-Control-Allow-Origin na *. Jednak Chrome nadal blokował moje żądania między domenami, podczas gdy w przeglądarce Firefox działało poprawnie.

Rozwiązaniem, które zadziałało, było dodanie nagłówka Access-Control-Allow-Methods o wartości OPTIONS, GET, POST. Zamieszczam to tutaj, na wypadek gdyby ktoś miał ten sam problem w przyszłości i żadne inne rozwiązania nie działają.

0

Problem może być w 4 różnych miejscach tutaj. Zacznijmy od definicji <virthualhost. Po pierwsze, istnieje kilka modułów i ustawień konfiguracyjnych, które musisz mieć, aby pozwolić twojej definicji vhosta na wdrożenie tych ustawień.

  • Zapewnienie mod_headers jest włączona
  • Zapewnienie swój podstawowy plik konfiguracyjny apache ma ustawienie AllowOverride które umożliwia vhostów zastąpić domyślny CORS ustawień

Po wykonaniu zarówno tych, można użyj ustawienia Access-Control-Allow-Origin, pod warunkiem, że można również stosować dyrektywę DocumentRoot

<VirtualHost *:80> 
    DocumentRoot /server/path/to/site/root 
    Header add Access-Control-Allow-Origin "mydomain.com" 
    Header add Access-Control-Allow-Origin "dev-mydomain.com" 
    Header set Access-Control-Allow-Methods "GET,POST,PUT,OPTIONS" 
</VirtualHost>