Existe uma maneira de permitir vários domínios cruzados usando o Access-Control-Allow-Origin
cabeçalho?
Estou ciente do *
, mas é muito aberto. Eu realmente quero permitir apenas alguns domínios.
Como exemplo, algo como isto:
Access-Control-Allow-Origin: http://domain1.example, http://domain2.example
Eu tentei o código acima, mas ele não parece funcionar no Firefox.
É possível especificar vários domínios ou estou com apenas um?
.htaccess
http
cors
xmlhttprequest
cross-domain
Thomas J Bradley
fonte
fonte
Access-Control-Allow-Origin
cabeçalho não significa que outros domínios não possam acionar um método nesse nó de extremidade (por exemplo, método da API REST). Significa apenas que origens não permitidas não podem usar o resultado em javascript (o navegador garante isso). Para restringir o acesso a um nó de extremidade para domínios específicos, use um filtro de solicitação do servidor que, por exemplo, retorne HTTP 401 para domínios não permitidos.Vary: Origin
cabeçalho quando você quiser usar vários URLs, consulte: fetch.spec.whatwg.org/#cors-protocol-and-http-cachesRespostas:
Parece que a maneira recomendada de fazer isso é fazer com que o servidor leia o cabeçalho Origin do cliente, compare-o com a lista de domínios que você deseja permitir e, se corresponder, faça eco ao valor do
Origin
cabeçalho de volta ao cliente como oAccess-Control-Allow-Origin
cabeçalho na resposta.Com
.htaccess
você pode fazer assim:fonte
Outra solução que estou usando no PHP:
fonte
header('Access-Control-Allow-Origin: *')
dito às vezes não pode usar curinga se o sinalizador de credenciais for verdadeiro - acontece quandoheader('Access-Control-Allow-Credentials: true')
provavelmente. Portanto, é melhor permitir a$http_origin
própria origem , se as condições forem atendidas.header("Access-Control-Allow-Origin: " . $http_origin);
a fazê-lo funcionarIsso funcionou para mim:
Quando colocado
.htaccess
, funcionará com certeza.fonte
Header set Access-Control-Allow-Credentials true
para que isso funcione como resposta 's @GeorgeReferer
vez deOrigin
. UsandoReferer
obras, mas o problema é que ele define o URL completo de volta paraAccess-Control-Allow-Origin
Eu quero cortar o nome de domínioReferer
e atribuí-loAccess-Control-Allow-Origin
. Algo como o resultado disso -echo http://example.com/index.php/ab/cd | cut -d'/' -f1,2,3
no comando bash. É possível fazer o mesmo no arquivo conf (apache)? Qualquer ideia?Eu tive o mesmo problema com fontes woff, vários subdomínios tinham que ter acesso. Para permitir subdomínios, adicionei algo assim ao meu httpd.conf:
Para vários domínios, você pode alterar o regex em
SetEnvIf
.fonte
(.*\.?example\.org)
paraexample.com
esub.example.com
.subexample.com
. Você deve alterá-lo para:((.*\.)?example\.org)
A seguir, mostramos como repetir o cabeçalho Origin se ele corresponder ao seu domínio com o Nginx. Isso é útil se você deseja exibir vários subdomínios de fonte:
fonte
.
exemplo example.org é interpretado como qualquer valor, pois é uma expressão regular? Nesse caso, isso permitiria por engano um TLD de organização de exemplo personalizado?"^example\.org$"
porque você precisa ter certeza de que um hacker não pode deslizar através de seu regex comsubdomainexample.org
(o uso^
) ouexample.orgevil
(uso$
) ouexamplezorg
(escape\.
)Aqui está o que eu fiz para um aplicativo PHP que está sendo solicitado pelo AJAX
Se a origem solicitante for permitida pelo meu servidor, retorne o
$http_origin
valor como próprio doAccess-Control-Allow-Origin
cabeçalho em vez de retornar um*
curinga.fonte
Você deve estar ciente de uma desvantagem: assim que você envia arquivos para uma CDN (ou qualquer outro servidor que não permita scripts) ou se seus arquivos são armazenados em cache em um proxy, alterando a resposta com base em 'Origem' cabeçalho da solicitação não funcionará.
fonte
Vary: Origin
não é suportado pela Akamai , uma das maiores CDNs do mercado ... Mais detalhes disponíveis aqui também #Para vários domínios, em seu
.htaccess
:fonte
Header set Vary Origin
seria uma boa adição a esta resposta.AccessControlAllowOrigin=$0$1
paraAccessControlAllowOrigin=$0
. Caso contrário, não funcionaria para origens HTTPS.http://example.com
saiu corretamente, mashttps://example.com
saiu comohttps://example.coms
, com um extras
no final.Para usuários do Nginx, permita o CORS para vários domínios. Gosto do exemplo do @ marshall, embora suas respostas correspondam apenas a um domínio. Para corresponder a uma lista de domínio e subdomínio, este regex facilita o trabalho com fontes:
Isso fará eco apenas aos cabeçalhos "Controle de acesso-Permitir origem" que correspondam à lista de domínios fornecida.
fonte
Para o IIS 7.5+ com o módulo URL Rewrite 2.0 instalado, consulte esta resposta do SO
fonte
Aqui está uma solução para o aplicativo da web Java, com base na resposta de yesthatguy.
Estou usando o Jersey REST 1.x
Configure o web.xml para conhecer o Jersey REST e o CORSResponseFilter
Aqui está o código para CORSResponseFilter
fonte
Como mencionado acima,
Access-Control-Allow-Origin
deve ser único eVary
deve ser definido comoOrigin
se você estiver atrás de uma CDN (rede de entrega de conteúdo).Parte relevante da minha configuração do Nginx:
fonte
set $cors
algum tipo de significado oculto, ou é apenas específico para o seu conifg? parece que ele pode ser omitido juntamente com a segundaif
Talvez eu esteja errado, mas, tanto quanto eu posso ver,
Access-Control-Allow-Origin
tem um"origin-list"
parâmetro as.Por definição, um
origin-list
é:E a partir disso, argumento que diferentes origens são admitidas e devem ser separadas por espaço .
fonte
5.1 Access-Control-Allow-Origin Response Header
afirma que a lista de origem é restrita: em vez de permitir uma lista de origens separada por espaço, é uma única origem ou a cadeia "nula".Para aplicativos ExpressJS, você pode usar:
fonte
Eu lutei para configurá-lo para um domínio executando HTTPS, então imaginei que compartilharia a solução. Eu usei a seguinte diretiva no meu arquivo httpd.conf :
Mude
example.com
para o seu nome de domínio. Adicione isso dentro<VirtualHost x.x.x.x:xx>
do seu arquivo httpd.conf . Observe que se o seuVirtualHost
tiver um sufixo de porta (por exemplo:80
), essa diretiva não se aplicará ao HTTPS, portanto você também precisará acessar / etc / apache2 / sites-available / default-ssl e adicionar a mesma diretiva nesse arquivo, dentro da<VirtualHost _default_:443>
seção.Depois que os arquivos de configuração forem atualizados, você precisará executar os seguintes comandos no terminal:
fonte
^http(s)?://(.+\.)?example\.com(:\d+)?$
Se você estiver tendo problemas com as fontes, use:
fonte
Uma abordagem mais flexível é usar as expressões do Apache 2.4. Você pode comparar com domínios, caminhos e praticamente todas as outras variáveis de solicitação. Embora a resposta enviada seja sempre
*
, os únicos solicitantes que a recebem são os que atendem aos requisitos de qualquer maneira. O uso doOrigin
cabeçalho de solicitação (ou qualquer outro) na expressão faz com que o Apache os mescle automaticamente noVary
cabeçalho de resposta, para que a resposta não seja reutilizada para uma origem diferente.fonte
*
credenciais como Login. Portanto, será melhor se você passar o nome do host correspondente em vez de*
.Access-Control-Allow-Origin
cabeçalho para aOPTIONS
solicitação de comprovação que verifica se há cabeçalhos para ver se o servidor permite essa origem. Eu consertei isso. Então*
não era o verdadeiro problema para mim. Porém, alguns navegadores ainda não aceitam*
credenciais; portanto, quando um aplicativo Web envia uma solicitação de origem cruzada, é necessário especificar oHTTP_ORIGIN
cabeçalho que você pode acessar dinamicamente com a variávelOrigin
in.htaccess
Apache ou$_SERVER['HTTP_ORIGIN'];
PHP. De qualquer forma a sua solução é bom porque permite que todas as origens, mas menos segura*
permite tudo. 2) HOST é diferente de ORIGEM. HOST é o 'TARGET HOST' real que é passado para o cabeçalho da solicitação. Mas ORIGIN é oINITIAL HOST
que envia a solicitação para oTARGET HOST
. Portanto, no seu código,ORIGIN HOST
é ignorado e nunca usado. Veja as respostas acima e você verá como eles usamORIGIN
valores para adicioná-losAccess-Control-Allow-Origin
.*
Não permite a todos, porque o uso doOrigin
cabeçalho de solicitação na expressão faz com que o Apache o mescle automaticamente noVary
cabeçalho de resposta, a menos que alguém o utilizereq_novary('Origin')
(provavelmente indesejável). Os navegadores sabem que podem obter uma resposta diferente para uma diferenteOrigin
e se o valor enviado não passar no teste de alguém, oAccess-Control-Allow-Origin
cabeçalho nunca será definido.Código PHP:
fonte
HTTP_ORIGIN não é usado por todos os navegadores. Quão seguro é HTTP_ORIGIN? Para mim, aparece vazio em FF.
Eu tenho os sites que permitem o acesso ao meu site enviando um ID do site, depois verifico meu banco de dados para o registro com esse ID e obtenho o valor da coluna SITE_URL (www.yoursite.com).
Mesmo se você enviar um ID de site válido, a solicitação precisará ser do domínio listado no meu banco de dados associado a esse ID de site.
fonte
Aqui está uma opção expandida para o apache que inclui algumas das definições de fonte mais recentes e planejadas:
fonte
Para facilitar o acesso a vários domínios para um serviço ASMX, criei esta função no arquivo global.asax:
Isso permite o manuseio do
OPTIONS
verbo CORS também.fonte
Exemplo de código PHP para subdomínios correspondentes.
fonte
Para uma cópia / colar razoavelmente fácil para aplicativos .NET, escrevi isso para ativar o CORS de dentro de um
global.asax
arquivo. Este código segue o conselho dado na resposta atualmente aceita, refletindo a origem na resposta. Isso efetivamente atinge '*' sem usá-lo.O motivo disso é que ele habilita vários outros recursos do CORS , incluindo a capacidade de enviar um AJAX XMLHttpRequest com o atributo 'withCredentials' definido como 'true'.
fonte
E mais uma resposta no Django. Para que uma única visualização permita o CORS de vários domínios, eis o meu código:
fonte
Gateway AWS Lambda / API
Para obter informações sobre como configurar várias origens no AWS Lambda sem servidor e no API Gateway - embora uma solução bastante grande para algo que você ache que deva ser bastante simples - veja aqui:
https://stackoverflow.com/a/41708323/1624933
No momento, não é possível configurar várias origens no API Gateway, consulte aqui: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html ), mas a recomendação (em a resposta acima) é:
A solução simples está obviamente habilitando ALL (*) assim:
Mas pode ser melhor fazer isso no lado do API Gateway (consulte o segundo link acima).
fonte
Access-Control-Allow-Credentials: true
não é permitido com curingaAccess-Control-Allow-Origin: *
. Defina um específico<origin>
.A resposta de suporte do Google na veiculação de anúncios por SSL e a gramática na própria RFC parece indicar que é possível delimitar espaço os URLs. Não tenho certeza de quão bem isso é suportado em diferentes navegadores.
fonte
origin-list
: tools.ietf.org/html/rfc6454#section-7.1Se você tentar tantos exemplos de código como eu para fazê-lo funcionar com o CORS, vale a pena mencionar que você deve limpar seu cache primeiro para tentar se ele realmente funciona, semelhante a problemas como quando imagens antigas ainda estão presentes, mesmo que sejam excluído no servidor (porque ainda está salvo no seu cache).
Por exemplo, CTRL + SHIFT + DELno Google Chrome para excluir seu cache.
Isso me ajudou a usar esse código depois de tentar muitas
.htaccess
soluções puras e este parecia o único funcionando (pelo menos para mim):Observe também que é amplamente difundido que muitas soluções dizem que você precisa digitar,
Header set ...
mas éHeader add ...
. Espero que isso ajude alguém com os mesmos problemas por algumas horas agora como eu.fonte
A resposta abaixo é específica para C #, mas o conceito deve ser aplicável a todas as plataformas diferentes.
Para permitir solicitações de origem cruzada de uma API da web, é necessário permitir solicitações de opção ao seu aplicativo e adicionar anotação abaixo no nível do controlador.
[EnableCors (UrlString, Header, Method)] Agora, as origens podem ser passadas apenas como string. Portanto, se você deseja passar mais de um URL na solicitação, passe-o como um valor separado por vírgula.
UrlString = " https: //a.hello.com,https: //b.hello.com "
fonte
Somente uma única origem pode ser especificada para o cabeçalho Access-Control-Allow-Origin. Mas você pode definir a origem da sua resposta de acordo com a solicitação. Também não se esqueça de definir o cabeçalho Vary. No PHP, eu faria o seguinte:
fonte
Também podemos definir isso no arquivo Global.asax para o aplicativo Asp.net.
fonte