Liberar acesso externo no PHP para AJAX (crossdomain)

Estou num projeto onde utilizo o PHP para gerar alguns JSON e HTMLs que devem ser acessados de outro domínio.

Como eu queria acessar por AJAX usando o jQuery, eu precisava liberar o acesso externo com PHP. Afinal um domínio não consegue acessar outro por AJAX sem ter uma liberação.

Achei que a liberação seria muito difícil. Que eu precisaria habilitar por htaccess ou alguma coisa assim.

Mas é muito fácil!

Basta você utilizar o header do php, conforme o exemplo abaixo

Neste exemplo, libero o acesso somente para um domínio específico:

header('Access-Control-Allow-Origin: http://dominio.com.br');

 

Neste exemplo, libero o acesso para qualquer domínio

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

 

E pronto! Basta acessar a url usando o método $.ajax, $.load, $.get do jQuery ou carregar o ajax da maneira que precisar.

 

Caso você queira utilizar em ASP.NET ou qualquer outra linguagem, este site deve lhe ajudar http://enable-cors.org/

Se você tiver uma maneira mais fácil(duvido) comenta ae. Se não der certo, comenta aí também que a gente tenta ajudar!

19 ideias sobre “Liberar acesso externo no PHP para AJAX (crossdomain)

  1. Olá,

    Eu sou leigo no assunto, mas fiz como exemplificado, e quando acesso a pagina, retorna a mensagem: Warning: Cannot modify header information – headers already sent by

    • Olá Marcos, você deve estar imprimindo algo acima da declaração do header. No PHP, você não deve utilizar nada de print ou echo antes do header. Também é ideal não ter nenhum espaço vazio antes de <?php.

      Evite fechar o PHP, deixe-o aberto no final da página. Espero que resolva

  2. Leo, utilizei este método e mesmo assim não funciona. Teria algum bloqueio por parte do cpanel que possa solucionar este problema?
    Já fiz um projeto onde consulto uma base de dados de um servidor da prefeitura, mas uso o jsonp e não tive problemas. Mas eu quero fazer minha própria base. Mas não consigo nem com jsonp nem json.

    Vlw

  3. Leo, tempos atrás eu fiz um código (em asp) pelo qual eu apontava para um outro site qualquer e trazia seu código fonte para uma variável, que em seguida tratava. Não me lembro mais como era e não consegui refazer! Como se faz isso (asp ou php)? Obrigado.

  4. Bom artigo.

    Na realidade um ajax pode acessar/receber dados de outro dominio e sem necessitar de liberação, mas isso depende da técnica utilizada. No caso o XHR possui restrições impostas pelos navegadores para trocar informações entre dominios diferentes, então basta enviar o cabeçalho de permissão.

    Existem varias técnicas de transmissão de dados, entre elas:
    XHR
    XHR Multiparte
    Comet
    Inserção dinâmica de tag script
    iframes

    No caso o mais comum é o XHR, porém por questões de segurança os navegadores impoem restrições.

    Se usarmos "Inserção dinâmica da tag script" podemos solicitar dados de um servidor em um dominio diferente. Essa técnica é usada para fazer "Json com Padding" ou simplesmente JsonP.

    Usando JsonP não existe a necessidade de liberação de dominio (cabeçalho).

    Nem sempre temos acesso ao site de outro dominio para adicionar Headers, então usamos JsonP.
    Vale lembrar que segurança é importante e cuidados devem ser tomados ao usar essa técnica, principalmente porquê estaremos confiando em informações de outro dominio que serão lidas até mesmo executadas em nosso site, uma vez que, JsonP pode ser executado de modo nativo.

    Também destaco que usar "Inserção dinâmica" é um hack, ele não tem barreiras de dominios mas não é tão robusto quanto XHR, não podemos enviar cabeçalhos com a solicitação, parâmetros podem apenas ser passados via GET, não podemos definir limites de tempo nem saber o status da solicitação.

    Por fim, a "inserção dinâmica" é apenas uma alternativa ao problema quando não se possui o controle das paginas em outro dominio para adicionarmos cabeçalhos de permissão.

    Então, se existe a possibilidade de passar o cabeçalho, passe-o e use XHR, mais robusto, mais seguro.

    Booa Leo.

      • Leo, utilizei este método e mesmo assim não funciona. Teria algum bloqueio por parte do cpanel que possa solucionar este problema?
        Já fiz um projeto onde consulto uma base de dados de um servidor da prefeitura, mas uso o jsonp e não tive problemas. Mas eu quero fazer minha própria base. Mas não consigo nem com jsonp nem json.

        Vlw

Deixe uma resposta