Com base na resposta de DaveRandom , eu também estava brincando e encontrei uma solução Apache um pouco mais simples que produz o mesmo resultado ( Access-Control-Allow-Origin
é definido com o protocolo específico atual + domínio + porta dinamicamente) sem usar nenhuma regra de reescrita:
SetEnvIf Origin ^(https?://.+\.mywebsite\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN
Header merge Vary "Origin"
E é isso.
Aqueles que desejam ativar o CORS no domínio pai (por exemplo, mywebsite.com), além de todos os seus subdomínios, podem simplesmente substituir a expressão regular na primeira linha por esta:
^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$
.
Nota: Para conformidade com especificações e comportamento correto de armazenamento em cache, SEMPRE inclua o Vary: Origin
cabeçalho de resposta para recursos habilitados para CORS, mesmo para solicitações não-CORS e de origem não permitida (veja o exemplo por que ).
//
desse contexto, já que o Apache conf não usa expressões regulares delimitadas por barras. O Regexr reclama porque, nesse contexto, as barras têm um significado especial como delimitadores.The 'Access-Control-Allow-Origin' header contains multiple values '^(https?://(?:.+.)?aerofotea.com(?::d{1,5})?)$', but only one is allowed. Origin 'http://local.aerofotea.com' is therefore not allowed access.
A especificação do CORS é tudo ou nada. Ele suporta apenas
*
,null
ou o protocolo exato + domínio + porta: http://www.w3.org/TR/cors/#access-control-allow-origin-response-headerSeu servidor precisará validar o cabeçalho de origem usando a regex e, em seguida, você poderá ecoar o valor de origem no cabeçalho de resposta Access-Control-Allow-Origin.
fonte
EDIT : Use a solução da @ Noyo em vez desta. É mais simples, mais claro e provavelmente muito mais eficiente sob carga.
RESPOSTA ORIGINAL DEIXADA AQUI PARA FINS HISTÓRICOS SOMENTE !!
Eu brinquei com esse problema e criei esta solução reutilizável .htaccess (ou httpd.conf) que funciona com o Apache:
Basta definir a
ACCESS_CONTROL_ROOT
variável na parte superior do bloco para o seu domínio raiz e ele ecoará oOrigin:
valor do cabeçalho da solicitação de volta ao cliente noAccess-Control-Allow-Origin:
valor do cabeçalho de resposta, se ele corresponder ao seu domínio.Note também que você pode usar
sub.mydomain.com
como oACCESS_CONTROL_ROOT
e ele vai limitar origenssub.mydomain.com
e*.sub.mydomain.com
(ou seja, ele não tem de ser a raiz do domínio). Os elementos que podem variar (protocolo, porta) podem ser controlados modificando a parte correspondente do URI do regex.fonte
Estou respondendo a essa pergunta, porque a resposta aceita não pode seguir
Por exemplo: ele não envia cabeçalhos CORS para http://mywebsite.com enquanto trabalha para http://somedomain.mywebsite.com/
Para ativar o seu site, basta colocá-lo no lugar de "mywebsite.com" na Configuração Apache acima.
Para permitir vários sites:
Teste Após a implantação:
A resposta de ondulação a seguir deve ter o cabeçalho "Access-Control-Allow-Origin" após a alteração.
fonte
Eu precisava de uma solução apenas para PHP, portanto, caso alguém precise dela também. Ele pega uma sequência de entrada permitida como "* .example.com" e retorna o nome do servidor do cabeçalho da solicitação, se a entrada corresponder.
E aqui estão os casos de teste para um provedor de dados phpunit:
fonte
preg_quote()
porque essa é a maneira correta de fazê-lo (mesmo que.
é a única regexp meta caractere válido em um nome de DNS,preg_quote()
descreve a operação destina-se melhor)none
não é um valor semanticamente válido para o cabeçalho (ou pelo menos não faz o que implica) de acordo com a especificação. Como tal,return null;
pode fazer mais sentido para essa ramificação e, nesse caso, nenhum cabeçalho deve ser enviado ao cliente; portanto, deve ser verificado pelo chamador.preg_quote()
citará o sinal * e,str_replace()
por exemplo, deixa um "\" órfão.Ao definir
Access-Control-Allow-Origin
em .htaccess, apenas o seguinte funcionou:Tentei várias outras palavras-chave sugeridas
Header append
,Header set
, nenhum funcionou como sugerido em muitas respostas sobre SO, embora eu não tenho idéia se essas palavras-chave são desatualizados ou não válidos para nginx .Aqui está minha solução completa:
fonte
Estávamos tendo problemas semelhantes com o Font Awesome em um domínio estático "sem cookies" ao ler fontes do "domínio de cookies" (www.domain.tld) e essa postagem foi nosso herói. Consulte aqui: Como corrigir o problema de fonte da web 'Faltando cabeçalho de resposta de compartilhamento de recursos de origem cruzada (CORS)'?
Para os tipos copy / paste-r (e para dar algumas sugestões), juntei tudo isso de todas as contribuições e o adicionei ao topo do arquivo .htaccess da raiz do site:
Super seguro, super elegante. Adorei: você não precisa abrir a largura de banda dos servidores para roubar recursos / tipos de hot-link-er.
Adereços para: @Noyo @DaveRandom @ pratap-koritala
(Tentei deixar isso como um comentário para a resposta aceita, mas ainda não posso fazer isso)
fonte
Para o Spring Boot , encontrei isso
RegexCorsConfiguration
que estende o funcionárioCorsConfiguration
: https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.javafonte
Parece que a resposta original foi anterior ao Apache 2.4. Não funcionou para mim. Aqui está o que eu tive que mudar para fazê-lo funcionar na 2.4. Isso funcionará para qualquer profundidade de subdomínio da suaempresa.com .
fonte
Eu tive que modificar um pouco a resposta de Lars , como um órfão
\
acabou na regex, para comparar apenas o host real (sem prestar atenção ao protocolo ou porta) e queria oferecer suporte aolocalhost
domínio além do meu domínio de produção. Assim, mudei o$allowed
parâmetro para uma matriz.Uso da seguinte maneira:
fonte
no meu caso usando angular
no meu interceptor HTTP, defino
no cabeçalho da solicitação
fonte