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?

user1401592
fonte

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"
imbrizi
fonte
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.

Miro
fonte
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

TARKUS
fonte
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,

Alex
fonte
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.

trueblue82
fonte
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>
Vo Quoc Cuong
fonte
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?

Dave Burton
fonte
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

Matt em Washington
fonte
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.

Behnam Shateri
fonte
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.

Simon Song
fonte