Implementa https://github.com/fruitcake/php-cors para Laravel
Desde o Laravel 9.2, este Middleware está incluído no laravel/framework. Você pode usar o middleware fornecido, que deve ser compatível com o middleware e a configuração fornecidos neste pacote. Consulte https://github.com/laravel/laravel/pull/5825/files para obter as alterações.
Etapas para atualizar:
Remova "fruitcake/laravel-cors"
do seu compositor.json
Substitua FruitcakeCorsHandleCors::class,
por IlluminateHttpMiddlewareHandleCors::class,
em app/Http/Kernel.php
Consulte https://github.com/fruitcake/php-cors
para uso avançado. A configuração permanece a mesma.
O pacote laravel-cors
permite enviar cabeçalhos de compartilhamento de recursos de origem cruzada com configuração de middleware Laravel.
Se quiser ter uma visão geral global do fluxo de trabalho do CORS, você pode navegar nesta imagem.
Ao atualizar das versões 0.x, existem algumas alterações importantes:
Uma nova propriedade 'paths' é usada para ativar/desativar o CORS em determinadas rotas. Este campo está vazio por padrão, então preencha-o corretamente!
O middleware de grupo não é mais suportado, use o middleware global
O nome do fornecedor foi alterado (ver instalação/uso)
O invólucro dos adereços em cors.php
mudou de camelCase para snake_case, portanto, se você já possui um arquivo cors.php
, precisará atualizar os adereços para corresponder ao novo invólucro.
Lida com solicitações OPTIONS pré-voo do CORS
Adiciona cabeçalhos CORS às suas respostas
Combine rotas para adicionar CORS apenas a determinadas solicitações
Solicite o pacote fruitcake/laravel-cors
em seu composer.json
e atualize suas dependências:
compositor requer bolo de frutas/laravel-cors
Se você tiver um conflito, isso pode ser porque uma versão mais antiga de barryvdh/laravel-cors ou fruitcake/laravel-cors está instalada. Remova primeiro o pacote conflitante e depois tente instalar novamente:
compositor remover barryvdh/laravel-cors bolo de frutas/laravel-cors compositor requer bolo de frutas/laravel-cors
Para permitir CORS para todas as suas rotas, adicione o middleware HandleCors
no topo da propriedade $middleware
da classe app/Http/Kernel.php
:
protegido $middleware = [ FruitcakeCorsHandleCors::class,// ...];
Agora atualize a configuração para definir os caminhos nos quais deseja executar o serviço CORS (consulte Configuração abaixo):
'caminhos' => ['api/*'],
Os padrões são definidos em config/cors.php
. Publique a configuração para copiar o arquivo para sua própria configuração:
fornecedor de artesão php:publish --tag="cors"
Nota: Ao usar cabeçalhos personalizados, como
X-Auth-Token
ouX-Requested-With
, você deve definir oallowed_headers
para incluir esses cabeçalhos. Você também pode configurá-lo como['*']
para permitir todos os cabeçalhos personalizados.
Observação: se você estiver explicitamente colocando cabeçalhos na lista de permissões, deverá incluir
Origin
ou as solicitações não serão reconhecidas como CORS.
Opção | Descrição | Valor padrão |
---|---|---|
caminhos | Você pode habilitar o CORS para um ou vários caminhos, por exemplo. ['api/*'] | [] |
métodos_permitidos | Corresponde ao método de solicitação. | ['*'] |
permitido_origins | Corresponde à origem da solicitação. Curingas podem ser usados, por exemplo. *.mydomain.com ou mydomain.com:* | ['*'] |
permitido_origins_patterns | Corresponde à origem da solicitação com preg_match . | [] |
cabeçalhos_permitidos | Define o cabeçalho de resposta Access-Control-Allow-Headers. | ['*'] |
cabeçalhos_expostos | Define o cabeçalho de resposta Access-Control-Expose-Headers. | [] |
idade_máx. | Define o cabeçalho de resposta Access-Control-Max-Age. | 0 |
suporte_credenciais | Define o cabeçalho Access-Control-Allow-Credentials. | false |
allowed_origins
, allowed_headers
e allowed_methods
podem ser definidos como ['*']
para aceitar qualquer valor.
Nota: Para
allowed_origins
você deve incluir o esquema quando não estiver usando um curinga, por exemplo.['http://example.com', 'https://example.com']
. Você também deve levar em consideração que o esquema estará presente ao usarallowed_origins_patterns
.
Nota: Tente ser o mais específico possível. Você pode começar a desenvolver com restrições flexíveis, mas é melhor ser o mais rígido possível!
Nota: Devido à substituição do método http no Laravel, permitir métodos POST também permitirá que os usuários da API executem solicitações PUT e DELETE.
Nota: Às vezes é necessário especificar a porta (quando você está codificando seu aplicativo em um ambiente local, por exemplo) . Você também pode especificar a porta ou usar um curinga aqui, por exemplo.
localhost:3000
,localhost:*
ou mesmo usando um FQDNapp.mydomain.com:8080
No Lumen, basta cadastrar o ServiceProvider manualmente no seu arquivo bootstrap/app.php
:
$app->register(FruitcakeCorsCorsServiceProvider::class);
Copie também o arquivo de configuração cors.php para config/cors.php
e coloque-o em ação:
$app->configure('cors');
Para permitir o CORS para todas as suas rotas, adicione o middleware HandleCors
ao middleware global e defina a propriedade paths
no arquivo config.
$app->middleware([// ...FruitcakeCorsHandleCors::class, ]);
Certifique-se de que a opção path
na configuração esteja correta e realmente corresponda à rota que você está usando. Lembre-se de limpar o cache de configuração também.
Às vezes, erros/middleware que retornam respostas próprias podem impedir a execução do middleware CORS. Tente alterar a ordem do Middleware e certifique-se de que seja a primeira entrada no middleware global, não um grupo de rotas. Verifique também se há erros reais em seus logs, pois sem o CORS, os erros serão engolidos pelo navegador, mostrando apenas erros de CORS. Tente também executá-lo sem CORS para ter certeza de que realmente funciona.
Se sua solicitação incluir um cabeçalho de autorização ou usar o modo Credenciais, defina o valor supports_credentials
na configuração como verdadeiro. Isso definirá o cabeçalho Access-Control-Allow-Credentials como true
.
Se você usar echo()
, dd()
, die()
, exit()
, dump()
etc em seu código, você interromperá o fluxo do Middleware. Quando a saída é enviada antes dos cabeçalhos, o CORS não pode ser adicionado. Quando o script é encerrado antes da conclusão do middleware CORS, os cabeçalhos CORS não serão adicionados. Sempre retorne uma resposta adequada ou lance uma exceção.
Se possível, use um grupo de rotas com proteção CSRF desabilitada. Caso contrário, você pode desabilitar o CSRF para determinadas solicitações em AppHttpMiddlewareVerifyCsrfToken
:
protegido $exceto = ['api/*','sub.domain.zone' => [ 'prefixo/*'], ];
O middleware CORS deve ser o único lugar onde você adiciona esses cabeçalhos. Se você também adicionar cabeçalhos em .htaccess, nginx ou em seu arquivo index.php, obterá cabeçalhos duplicados e resultados inesperados.
Se você não estiver fazendo solicitações entre sites, ou seja, se não estiver solicitando site-a.com/api do site-b.com, seu navegador não enviará o cabeçalho de solicitação Origin: https://site-b.com
, O CORS será "desativado", pois o cabeçalho Access-Control-Allow-Origin
também estará ausente. Isso acontece porque as solicitações estão sendo despachadas do mesmo e nenhuma proteção é necessária neste caso.
Lançado sob a licença MIT, consulte LICENÇA.