PDA

Pogčedajte punu verziju : Ajax & cross-subdomain problemi


bNasty
15. 01. 2007., 16:21
Upao sam u glupi problem, pa sad sumnjam i u ono shto (valjda) znam (ili ne znam).

Elem, ponudio se da pomognem prijatelju da formatira xml podatke koje mu shalje web server i da ih prikazhe na web strani. Stvar mora da bude client-side, jer nema pristup aplikaciji na serveru, i sve shto mozhe da dobije nazad je (ochajno formatiranu!) xml stranu.
OK, malo Ajax-a, formatiranja xml-a, i html-inject u letu je reshilo problem i to lepo radi u testu.

Medjutim, produkcijski server se nalazi na drugom subdomenu od strane koja ce otvarati konekciju ka serveru (xml dolazi sa profile.something.com a Ajax radi sa www.something.com). I naravno sada nijedan browser nece da otvori request prema strani u drugom subdomenu.

Jedino shto mi pada na pamet (a da nisu neki ruzhni iframe-bridge hakovi) je da stavi Ajax stranu na isti subdomen sa serverom, i odatle je pokupi u iframe-u.

Imate li josh neki predlog, za sluchaj da ne mozhe da pristupi fizichki subdomenu gde je server aplikacija?

TIA

jablan
15. 01. 2007., 16:45
Baci pogled na ovo:

http://developer.yahoo.com/javascript/howto-proxy.html

marinowski
15. 01. 2007., 16:50
... i ovde:

http://www.ajaxian.com/archives/how-to-make-xmlhttprequest-calls-to-another-server-in-your-domain

bNasty
15. 01. 2007., 16:52
Hvala, vidjao sam neka Proxy reshenja ranije ali nisam obracao pazhnju do sada.

Od svih ponudjenih eventualno url-rewrite bi mogao da pomogne (jer nishta od PHP-a, json-a i slichnih opcija). Ili to, ili neka kopira stranu i script u isti subdomain nekako.

cvele
15. 01. 2007., 17:02
uh nemam link ovde, pitacu kolegu sutra... ima jedna zgodna stvarcica koja funkcionise preko flasha... radi cross domain

marinowski
15. 01. 2007., 18:34
Sve cemo cesce vidjati javascript + flash resenja, s tim da korisnik nece ni znati da koristi flash. Dovoljan razlog je bolji storage engine kod flasha.

ivanhoe
15. 01. 2007., 21:28
flashu ako dodas crossdomain.xml u root site-a, onda mozes da mu obezbedis da skida podatke odakle hoces..

napises u tom fajlu nesto tipa:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="www.nesto.com" />
</cross-domain-policy>


i to bi trebalo da radi..

bNasty
16. 01. 2007., 18:59
Hvala na odgovorima.

Od svega ponudjenog je mod_rewrite (pomenut na yahoo-u) najbrzhe reshenje.

Mozhda ovo i nije forum za to, ali pitanje za mod_rewrite znalce (jer nemam trenutno nijedan remote server na raspolaganju da isprobam):

Redirekcija mora da bude "silent", tj. 30x response nije prihvatljiv jer javascript ochekuje xml. To sve lepo radi kada se redirektuje unutar istog subdomain-a, ali kakva je situacija sa npr.
RewriteRule ^/xml_data/([./]+)$ http://profile.blabla.com/$1 [QSA,T=application/xml,L]
(ovo napamet kucam, ali to je ideja). Oba dela se nalaze na istom domenu, ali razlichiti sub domeni. Da li u tom sluchaju mora da se koristi i [P] flag, tj. mod_proxy? Nisam siguran da server uopshte ima mod_proxy ukljuchen, shto bi bio problem...

TIA

ivanhoe
16. 01. 2007., 20:30
ne moze to tako, ako zelis spoljni redirekt (sa promenom domena) moras browseru da nalozis da to uradi sa 301 (ili vec kojim) responsom uz pomoc [R] flaga. Ako ne stavis [R] onda radis unutrasnji redirect apache-u i tako ne mozes da promenis domen.

Ono sto moze da se uradi (ali ja nemam nikakvog iskustva sa tim) je da koristis apache kao proxy server (sa mod_proxy), pa da mod_rewrite-u nalozis da uradi rewrite i posalje proxy zahtev. To se radi sa [P] flagom i pretpostavljam da bi sintaxa isla ovako nekako:
RewriteRule ^/xml_data/([./]+)$ http://profile.blabla.com/$1 [P,QSA,T=application/xml,L]

EDIT: pogledaj i ProxyPass komandu za mod_proxy, ona radi nesto slicno: http://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypass

bNasty
17. 01. 2007., 01:15
Tja.... preko preche, naokolo blizhe.... lepo je meni govorio tata, mani web i drzhi se C++a :)

Na kraju sam sredio nekako problem preko bridge-a u PHP-u :\

Da ne bude sve kako treba curl nije bio dostupan, ali sam nekako ishchupao reshenje - preko stream_context_create() funkcije.

Hvala josh jednom, poz