Zend Framework em nginx
-
22-08-2019 - |
Pergunta
O site baseado Zend Framework Tenho vindo a trabalhar no agora está sendo migrado para o servidor de produção. Este servidor acaba por ser nginx (surpresa!). Naturalmente o site não funciona corretamente como ele foi desenvolvido em Apache e se baseia em um arquivo .htaccess.
A minha pergunta é ... Alguém tem alguma experiência com isso? Todas as ideias sobre como traduzir o que o arquivo .htaccess faz para um arquivo nginx.conf? Estou pesquisando isso, mas estou esperando que alguém já tem experiência com isso. Obrigado!
EDIT: Este é o htaccess atual:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]
Solução
Eu sei que é um fio muito velho mas pode ajudar algumas pessoas de qualquer maneira.
Basicamente ele redireciona qualquer erro 404 para index.php, mas se o arquivo existe (tipo de arquivo) que vai definir a raiz direita.
Eu fiz isso a partir do topo da minha cabeça. Ele pode não estar funcionando imediatamente, e você tem que colocar o caminho certo e configuração fastcgi. Eu também colocar tudo de volta para index.php como ele deve funcionar assim com Zend_Framework
error_page 404 = /index.php;
location / {
if (-f $request_filename) {
root /var/www;
}
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/index.php;
include /etc/nginx/fastcgi_params;
}
Outras dicas
server {
listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
error_log /var/log/nginx/localhost.error.log;
root /var/www/localhost/public;
try_files $uri @php_index;
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location @php_index {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/localhost/index.php;
include fastcgi_params;
}
}
É recomendado para usar try_files sempre que possível.
Eu não sei de nenhuma maneira automática / sistemática para converter o arquivo .htaccess, você provavelmente vai ter que fazê-lo manualmente. A Nginx wiki é o melhor recurso para a documentação nginx.
Editar: Estou executando o Zend Framework em Nginx me agora e os olhares de configuração como esta:
server {
listen 80;
server_name servername.com;
root /var/www/zendapp/public;
location / {
index index.php;
}
# Deny access to sensitive files.
location ~ (\.inc\.php|\.tpl|\.sql|\.tpl\.php|\.db)$ {
deny all;
}
location ~ \.htaccess {
deny all;
}
# Rewrite rule adapted from zendapp/public/.htaccess
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
# PHP scripts will be forwarded to fastcgi processess.
# Remember that the `fastcgi_pass` directive must specify the same
# port on which `spawn-fcgi` runs.
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
location = /50x.html {
root /var/www/default;
}
}
Como você pode ver, a própria regra de reescrita é muito simples.
Este é "oficial", simples e funciona agradável:
Para encenar servidor que poderia ajudar;)
fastcgi_param APPLICATION_ENV staging;
Na verdade eu executar um nginx com um site Drupal que funcionam como Zend Framework: um index.php como inicialização
Esta é a regra (não testado em Zend Framework, apenas em Drupal, mas deve ser similar)
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
}
}
error_page 404 /index.php;
Se você usar um subdiretório para o seu projeto como http: //some.url/myproject/controller/ , então você também precisa adicionar setBaseUrl ao seu arquivo de inicialização.
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initSomeFancyName()
{
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$frontController->setBaseUrl('/myproject'); // set the base url!
}
}
A reescrita nginx ficaria assim:
location /myproject/ {
if (!-e $request_filename) {
rewrite ^/myproject/(.*)$ /index.php?$1? last;
}
}
PS O ponto de interrogação não é erro de digitação!
Se fosse possível, eu recomendaria que eles configuração Apache em uma porta fora do padrão acessível apenas a partir da caixa Nginx, e têm de proxy Nginx para Apache.