2013-03-22 11 views
5

Ho due file, domain.com/test2.php:Perché non imposta document.domain per consentire le richieste AJAX a un dominio padre?

<div id="testDiv"></div> 

<script src="http://domain.com/packages/jquery.js"></script> 
<script>$("#testDiv").load("http://domain.com/test3.php", {var1:1, var2:2});</script> 

e domain.com/test3.php:

<b>var1: <?php echo $var1; ?> , var2: <?php echo $var2; ?></b> 

In questo caso le uscite domain.com/test2.php var1: 1 , var2: 2 come ci si aspetterebbe, ma ora diciamo che voglio fare un test2.php in un sottodominio. Per interrompere problemi con lo scripting cross-domain, vorrei aggiungere questa riga in più per l'inizio del sub.domain.com/test2.php:

<script>document.domain = "domain.com";</script> 

Questa linea più ferma l'errore di cross-domain da rivelare, ma ora il file non esce più var1: 1 , var2: 2. Perché è questo e come posso risolvere questo?

+1

Riesci a vedere la richiesta per il sottodominio visualizzata nel registro di rete negli strumenti di sviluppo? Sembra che sia riuscito e ha restituito la risposta che ci si aspettava? –

+0

@MartinAtkins La richiesta viene visualizzata in rosso con lo stato "(annullato)". –

risposta

10

Il meccanismo document.domain è concepito per consentire la comunicazione lato client tra frame, piuttosto che comunicazione da client a server. Se si dispone di un frame contenente una pagina da example.com e un altro frame contenente una pagina da foo.example.com, i due non possono accedere al rispettivo DOM a meno che quest'ultimo non imposti document.domain a example.com come mostrato nell'esempio.

Il moderno meccanismo preferito per le richieste AJAX tra domini è Cross-Origin Resource Sharing o "CORS". Questo meccanismo implica che la risorsa di destinazione restituisca un'intestazione di risposta HTTP speciale che indica che sono consentite richieste tra domini. Nel vostro piano d'azione che ci fate il vostro test3.php restituire il seguente intestazione della risposta HTTP:

Access-Control-Allow-Origin: sub.domain.com 

In PHP si farebbe in questo modo:

header("Access-Control-Allow-Origin: sub.domain.com"); 

È inoltre possibile impostare questo valore intestazione ad appena * per consentire le richieste tra domini da all'origine, ma sappi che ciò consentirà richieste da siti che non controlli.

richieste da JavaScript lato client librerie spesso includono anche l'intestazione aggiuntiva X-Requested-With che non è nel set standard consentiti dalla CORS, quindi potrebbe essere necessario per consentire esplicitamente questa intestazione tramite un'intestazione di risposta supplementare:

Access-Control-Allow-Headers: X-Requested-With 

CORS è supportato solo nei browser moderni. Per i browser più vecchi la convenzione comune è usare JSON-P, che è un trucco che sfrutta il fatto che una pagina su un server è in grado di caricare ed eseguire un file di script da un altro server. Questa tecnica richiede che la risorsa di destinazione sia un programma JavaScript valido che richiama una funzione nella pagina, quindi non è elegante e senza soluzione di continuità come CORS, ma dovrebbe funzionare in qualsiasi browser che supporti JavaScript.

+0

Sì. E l'impostazione di * indica che qualsiasi dominio può caricare dati da esso. –

+0

Oh sì ... ho aggiunto questo alla mia risposta. Grazie. –

+0

Quando provo questo, ottengo un errore interno del server 500: Errore interno server Il server ha riscontrato un errore interno o una configurazione errata e non è stato in grado di completare la richiesta. Inoltre, si è verificato un errore 404 non trovato durante il tentativo di utilizzare un ErrorDocument per gestire la richiesta. –

Problemi correlati