Ok, eu encontrei o problema. fastcgi_intercept_errors estava ligado, e nginx estava interceptando os erros ... parece óbvio agora. Eu mudei para fastcgi_intercept_errors, e agora está funcionando perfeitamente.
Em Opencart, o erro 404 é mostrado nesta url: /index.php?route=error/not_found Esta página tem uma página personalizada 404 com o modelo de todo o site.
Eu tentei no Nginx com:
error_page 404 = /index.php?route=error/not_found;
Mas vai para a página de erro do nginx 404. Se eu só escrevo:
error_page 404 = /index.php;
Vai para o índice, mas eu não quero ir para o índice, eu quero ir para a página 404.
Eu também tentei com um local nomeado e dentro de uma reescrita, mas não consegui trabalhar:
error_page 404 = @error;
location @error {
rewrite ^.*$ /index.php?route=error/not_found last;
}
Também não funciona. Vai para a página de erro do nginx 404