O conjunto de cabeçalho Access-Control-Allow-Origin em .htaccess não funciona


90

Não consigo descobrir por que minhas .htaccessconfigurações de cabeçalho não funcionam.

.htaccessConteúdo do meu arquivo:

Header set Access-Control-Allow-Origin *
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Headers "*"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

Mas quando eu removo Headere os adiciono index.php, tudo funciona bem.

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: *");

O que estou perdendo?

Respostas:


134

Isso deve funcionar:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

46
Não se esqueça de ativar os cabeçalhos do módulo apachea2enmod headers
— Lucas Serafim

1
Ele corrigiu: "O método PUT não é permitido por Access-Control-Allow-Methods"
— Rahul Prasad

6
Além disso, é melhor usar Header setneste caso. Se o código for alterado e ele definir o cabeçalho, fazer o Apache fazer um header addenviará cabeçalhos ** duplos. Isso quebrará clientes como Restangular, por exemplo.
— Julian

2
Não se esqueça, se necessário,Header add Access-Control-Allow-Credentials "true"
— Marco Marsala

20

Apenas para registro, eu estava tendo exatamente o mesmo problema e nenhuma das respostas funcionou.

Usei uma ferramenta de verificação de cabeçalhos: http://www.webconfs.com/http-header-check.php

Estava testando com meu IP ( http://192.0.2.1/upload) e o que voltou foi o seguinte:

HTTP/1.1 301 Moved Permanently => 
Date => Sat, 10 Jan 2015 04:03:35 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
Location => http://192.0.2.1/upload/
Content-Length => 380
Connection => close
Content-Type => text/html; charset=iso-8859-1

Ocorreu um redirecionamento e a solicitação AJAX não honra / segue redirecionamentos.

Descobriu-se que era a barra que faltava no final do domínio ( http://192.0.2.1/upload / )

Testei novamente com barra no final e consegui isso abaixo. Também foi adicionada uma barra ao script e agora estava funcionando.

HTTP/1.1 200 OK => 
Date => Sat, 10 Jan 2015 04:03:53 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By => PHP/5.3.8
Access-Control-Allow-Origin => *
Access-Control-Allow-Methods => PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers => *
Content-Length => 1435
Connection => close
Content-Type => text/html

Use esta ferramenta para testar se seus cabeçalhos são bons e para solucionar o que está acontecendo.


5
Tenho 11 guias abertas agora tentando resolver isso. Esta resposta deve estar em mais lugares.
— JDavis

Com o meu, eu precisava remover a barra final. Estou tão feliz por ter encontrado isso. Gastei muito tempo solucionando isso quando eu sabia que deveria estar funcionando há horas.
— gorelog

11

Eu tenho uma hospedagem compartilhada no GoDaddy. Eu precisava de uma resposta para essa pergunta também, e depois de pesquisar, descobri que é possível.

Eu escrevi um arquivo .htaccess, coloque-o na mesma pasta que minha página de ação. Aqui está o conteúdo do arquivo .htaccess:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

Aqui está a minha chamada ajax:

    $.ajax({
        url: 'http://www.mydomain.com/myactionpagefolder/gbactionpage.php',  //server script to process data
        type: 'POST',
        xhr: function() {  // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax events
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form data
        data: formData,
        //Options to tell JQuery not to process data or worry about content-type
        cache: false,
        contentType: false,
        processData: false
    });

Veja este artigo para referência:

O conjunto de cabeçalho Access-Control-Allow-Origin em .htaccess não funciona


8

Tenha cuidado com:

 Header add Access-Control-Allow-Origin "*"

Não é nada judicioso conceder acesso a todos. É preferível permitir uma lista de hosts confiáveis ​​conhecidos apenas ...

Header add Access-Control-Allow-Origin "http://aaa.example"
Header add Access-Control-Allow-Origin "http://bbb.example"
Header add Access-Control-Allow-Origin "http://ccc.example"

Saudações,


3
Isso não vai funcionar. O Access-Control-Allow-Origin não permite valores múltiplos. Você precisa definir dinamicamente o cabeçalho com base no valor do cabeçalho da solicitação Origin.
— Quentin

7

Eu ativei os cabeçalhos a2enmod dos cabeçalhos do módulo Apache e o problema foi resolvido.


Os erros no log não eram claros quanto ao motivo pelo qual as alterações que eu estava fazendo falhariam e essa resposta ajudou muito. sudo a2enmod headerse uma reinicialização fez com que funcionasse!
— cchana

3

Tente isso no .htaccess da pasta raiz externa

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

Tenha cuidado com: Header add Access-Control-Allow-Origin "*" Isso não é judicioso para conceder acesso a todos. Acho que você deve usar:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>

3

Eu marquei a resposta de Miro com +1 para o link para o site do verificador de cabeçalho http://www.webconfs.com/http-header-check.php . Ele exibe um anúncio desagradável toda vez que você o usa, mas é, no entanto, muito útil para verificar a presença do cabeçalho Access-Control-Allow-Origin.

Estou lendo um arquivo .json do javascript em minha página da web. Descobri que adicionar o seguinte ao meu arquivo .htaccess corrigiu o problema ao visualizar minha página da web no IE 11 (versão 11.447.14393.0):

<FilesMatch "\.(json)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

Também adicionei o seguinte ao /etc/httpd.conf (arquivo de configuração do Apache):

AllowOverride All

O site do verificador de cabeçalho verificou se o cabeçalho Access-Control-Allow-Origin está sendo enviado (obrigado, Miro!).

No entanto, Firefox 50.0.2, Opera 41.0.2353.69 e Edge 38.14393.0.0 buscam o arquivo de qualquer maneira, mesmo sem o cabeçalho Access-Control-Allow-Origin. (Observação: eles podem estar verificando endereços IP, já que os dois domínios que eu estava usando estão hospedados no mesmo servidor, no mesmo endereço IPv4.)

No entanto, o Chrome 54.0.2840.99 m (64 bits) ignora o cabeçalho Access-Control-Allow-Origin e falha de qualquer maneira, relatando erroneamente:

Nenhum cabeçalho 'Access-Control-Allow-Origin' está presente no recurso solicitado. Origem ' {mydomain} ', portanto, não é permitido o acesso.

Acho que isso tem que ser algum tipo de "primeiro". O IE está funcionando corretamente; Chrome, Firefox, Opera e Edge são todos bugados; e o Chrome é o pior . Não é exatamente o oposto do caso usual?


0

Depois de passar meio dia sem nada funcionando. Usando um serviço de verificação de cabeçalho, embora tudo estivesse funcionando. O firewall no trabalho estava removendo-os


0

tente isto:

<IfModule mod_headers.c>
     Header set Access-Control-Allow-Credentials true
     Header set Access-Control-Allow-Origin "your domain"
     Header set Access-Control-Allow-Headers "X-Requested-With"
</IfModule>

É preferível permitir uma lista de hosts confiáveis ​​conhecidos.


0

Se alguém está tentando fazer isso, a resposta mais votada deve funcionar. No entanto, se você estiver tendo problemas, é possível que o navegador tenha armazenado em cache o REQUEST. Para confirmar, acrescente uma string de consulta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.