Magento: conflito de rotas entre frontend e admin
Hoje eu estava trabalhando num bug de um módulo de terceiros. Algo simples, o botão do adicionar ao carrinho fazia seu trabalho por AJAX, ao invés do tradicional POST. Entretanto, toda vez que eu chamava a URL http://.../ajaxcart/cart/add
, eu recebia um HTTP status 302, ou seja, um redirecionamento, para a mesma URL, porém em modo seguro (HTTPS).
Depois de um processo de debug, constatei que o controller não era chamado quando era feita a requisição, portanto o problema deveria estar em alguma configuração do Magento. E de fato, estava. O painel administrativo estava configurado para utilizar o HTTPS (Configurações > Geral > Web > Seguro > Usar SSL no Admin), e quando eu removia esta opção, tudo funcionava conforme o esperado.
No final de contas, o problema era esse:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<frontend>
<routers>
<ajaxcart>
<use>standard</use>
<args>
<module>Empresa_AjaxCart</module>
<frontname>ajaxcart</frontname>
</args>
</routename>
</routers>
</frontend>
<admin>
<routers>
<ajaxcart>
<use>admin</use>
<args>
<module>Empresa_AjaxCart</module>
<frontname>ajaxcart</frontname>
</args>
</routename>
</routers>
</admin>
Percebam acima que nas duas situações, o frontname
é o mesmo. Desta forma, toda vez que era acessada uma url no padrão http://.../ajaxcart/*
, o Magento mandava uma resposta ao navegador para redirecionar para o modo seguro. No caso de um AJAX, isso traz dois problemas:
- Geralmente os desenvolvedores não se preocupam com outros status diferentes de 200 numa requisição AJAX;
- É necessário configurar a política conhecida como
Same-Origin Policy
, ou ainda os famosos erros deCORS
, tal qual o Firefox informa:
1
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://.../ajaxcart/cart/add/. This can be fixed by moving the resource to the same domain or enabling CORS.
Portanto, fica a dica, sempre que forem desenvolver módulos que tenham controllers tanto no frontend quanto no admin, atentem-se para não utilizar o mesmo frontname nas rotas.
Até mais!