Neste final de semana, eu quis trocar meu servidor web de Apache para NGINX. A instalação foi fácil, a configuração básica foi fácil, mas tive um “pequeno grande” problema com o CakePHP… Não aparecia nada na minha tela, ou aparecia um erro 500. O que fazer agora?
Tanto CakePHP quanto WordPress foram projetados para trabalhar com Apache, pois eles vêm com alguns .htaccess prontos para nós. Meu desafio era justamente esse! Reescrever o .htaccess do CakePHP para que o NGINX trabalhasse da mesma forma que o Apache estava trabalhando.
Abrindo o .htaccess do diretório raiz do CakePHP, temos:
1 2 3 |
RewriteEngine on RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] |
Abrindo o .htaccess do diretório /app:
1 2 3 |
RewriteEngine on RewriteRule ^$ webroot/ [L] RewriteRule (.*) webroot/$1 [L] |
E por último, o .htaccess do diretório /app/webroot:
1 2 3 4 |
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,L] |
Observando essas regras, a lógica que eu entendi foi: RAIZ DIRECIONA PARA APP, QUE DIRECIONA PARA WEBROOT, QUE TRATA A URL. Então eu escrevi uma regra para que o NGINX fizesse a mesma coisa. Lembrando que meu projeto do CakePHP estava em um subdiretório da raiz do meu servidor web, portanto se a raiz do servidor era public_html, meu projeto era um subdiretório em public_html. Suponhamos que o nome dele seja foobar, as regras ficaram assim:
1 2 3 4 |
location /foobar { rewrite ^/foobar/(.*)$ /foobar/app/webroot/$1 break; try_files $uri $uri/ /foobar/app/webroot/index.php?q=$uri&$args; } |
Se alguém souber de uma maneira melhor, compartilhe nos comentários… Recomendo muito a leitura deste link: http://wiki.nginx.org/Pitfalls
rapaz, que zica, hein? mas se resolveu ta aí a solução documentada para futuras consultas, vlw brow!
Poderia disponibilizar o /etc/nginx/sites-available/default?
Pois, comigo os arquivos do webroot/ não abrem. O nginx retorna 404.
Vou enviar no seu email o que eu uso…
Disculpen necesito ayuda soy estudiante de I.S.C de 5 semestre necesito ayuda en la reglas que usa nginx no me las se y he buscando en google pero no he tenido éxito alguno me gustaria que me podrian enviar o darme no se una url donde pueda tener acceso a esas reglas, cuales son y para que sirve.
http://wiki.nginx.org/HttpRewriteModule
http://wiki.nginx.org/Configuration
Good Job Heitor!
I’m still trying to figure out a way to fix CakePHP2 baseurl for static files, as css and images. My page returns /foobar/css/cake.generic.css instead of /foobar/app/webroot/css/cake.generic.css. I’m starting on version 2.2.4.
Thanks, Marcelo
Hi Heitor,
I found my error. I had a specific location for static files, which I setup when I installed nginx for the first time according to http://www.howtoforge.com/installing-php-5.3-nginx-and-php-fpm-on-ubuntu-debian:
Just commented that section and everything works ok now.
Have a NIce Day!
Marcelo,
to treat static files, we can use this:
I guess it’s a better approach to performance!
What you think?
Fala Heitor, cara, eu tentei configurar o cake no ngnix mas ele não encontra o css, as imagens e nem o js. Qual configuração você usa para isso?
Então Pedro, a configuração que eu uso é essa do Post mesmo… Como que é a URL do seu projeto, e como que o Cake gera a url dos css, js e imagens? Como que você está chamando essas coisas no código? Cria também um gist da sua configuração de NGINX para eu ver…
Great tutorial, you’ve saved my day. I spent hours trying to configure cakephp application in my server. Thanks for the nice article.
I’m glad I could help! Mail me if you have any further questions… 😉
Olá Heitor.
Não consigo fazer Rewrite funcionar no Nginx com Cakephp 3.
Meu projeto está em uma subpasta na raiz e a parte do rewrite está assim:
Poderia me ajudar?
Olá Diego! Tudo bem?
Desculpe a demora para responder… instalei um CakePHP 3.2 só para poder te falar o que fazer, e minha configuração final ficou assim:
Só com isto, já funcionou!
Com esta configuração os so funciona a index, o controller pages por exemplo nao, por padrao ao acessado a url retorna pra index, mas não é isso que acontece
Leandro,
testei com a mesma configuração que faço pro Laravel, e funcionou legal desta vez: