Esiste un modo per abilitare il Cross-Origin Resource Sharing per l'ajaxurl di WordPress?

18 ago 2015, 14:30:24
Visualizzazioni: 51.9K
Voti: 10

WordPress ha già un URL predefinito per le chiamate jQuery-WordPress noto come ajaxurl. Tuttavia, ci sono casi in cui è necessario abilitare il Cross-Origin Resource Sharing (CORS) su di esso in modo che qualsiasi hostname possa accedervi.

La mia soluzione attuale è aggiungere una riga in /wp-includes/http.php con:

@header( 'Access-Control-Allow-Origin: *' );

In modo che diventi:

http.php

...
function send_origin_headers() {
    $origin = get_http_origin();

    @header( 'Access-Control-Allow-Origin: *' );
    if ( is_allowed_http_origin( $origin ) ) {
        @header( 'Access-Control-Allow-Origin: ' .  $origin );
        @header( 'Access-Control-Allow-Credentials: true' );
        if ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] )
            exit;
        return $origin;
    }

    if ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] ) {
        status_header( 403 );
        exit;
    }

    return false;
}
...

Funziona ma modificare il core di WordPress non è una buona soluzione.

Esiste un modo migliore per abilitare il CORS per ajaxurl?

Avvertenza

Questo argomento contiene vulnerabilità di sicurezza quando viene effettivamente implementato su un'installazione WordPress.

Nota

Questa domanda è stata pubblicata durante l'era di WordPress 4.3. Quando è stato rilasciato WordPress 4.4 con la nuova funzionalità WordPress REST API, l'abilitazione del CORS non è più diventata necessaria e invece è sufficiente utilizzare l'hook rest_api_init per aggiungere endpoint REST personalizzati.

5
Commenti

Vuoi chiamare un'API, giusto?? Tipo JSON?

Sundar Sundar
18 ago 2015 14:31:34

@solai Verrà utilizzato per ottenere un valore di risposta da un'action specifica come da AJAX nei plugin WordPress

Abel Melquiades Callejo Abel Melquiades Callejo
18 ago 2015 14:33:56

OH... Quindi vuoi inviare una richiesta a un dominio diverso. Vuoi chiamare questo URL xxx.com/ajax.php da yyy.com? Giusto?

Sundar Sundar
18 ago 2015 14:46:10

Esatto @solai

Abel Melquiades Callejo Abel Melquiades Callejo
18 ago 2015 14:52:34

Se osservi il sorgente, sia get_http_origin che is_allowed_http_origin hanno dei filtri che ti permettono di manipolare i loro valori.

Milo Milo
18 ago 2015 17:56:01
Tutte le risposte alla domanda 4
0
18

Milo ha ragione.

Ad esempio, vai nel file functions.php del tuo tema e aggiungi il seguente codice:

add_filter( 'allowed_http_origins', 'add_allowed_origins' );
function add_allowed_origins( $origins ) {
    $origins[] = 'https://site1.example.com';
    $origins[] = 'https://site2.example.com';
    return $origins;
}

Ora una chiamata ajax da https://site1.example.com all'URL ajax del tuo sito avrà l'appropriato header Access-Control-Allow-Origin nella risposta. Esempio:

$.ajax({
    url: 'https://site1.example.com/wp-admin/admin-ajax.php',
    type: "POST",
    data: {
        ...
    },
    success: function(doc) {
        ...
    }
});
13 mag 2016 11:12:05
0

Basta aggiungere questo codice nel tuo functions.php, non è necessario aggiornare .htaccess, /wp-includes/http.php o qualsiasi altro file core.

function just_add_cors_http_header($headers){

    $headers['Access-Control-Allow-Origin'] = '*';

    return $headers;

}

add_filter('wp_headers','just_add_cors_http_header');

Saluti!

31 mar 2020 22:43:32
0

Puoi ottenerlo con il seguente codice.

Apri il tuo file header.php

cerca il seguente testo nel file

<!DOCTYPE html>

e sostituiscilo con quanto segue.

<?php /** @package WordPress @subpackage Default_Theme  **/
header("Access-Control-Allow-Origin: *"); 
?>
<!DOCTYPE html>
...

Ora potrai vedere Access-Control-Allow-Origin: * nel tuo header.

Spero sia utile..! Saluti.

18 ago 2015 16:39:59
0

Il modo migliore che ho trovato è seguire questo link.

Basta aggiungere il codice originale al file header.php di WordPress oppure al file functions/api per AJAX.

Link: [https://stackoverflow.com/a/25719261/5431206]

Grazie

13 nov 2019 10:29:18