Nginx Zend Framework

8 Cevap php

Ben üzerinde çalışıyoruz Zend Framework tabanlı bir site artık üretim sunucusuna taşınıyor. Bu sunucu nginx (sürpriz!) olduğu ortaya çıkıyor. Apache üzerinde geliştirilen ve bir htaccess dosyasına dayanır gibi doğal sitesi düzgün çalışmıyor.

Benim soru Herkes bu ile herhangi bir deneyimi var ... mı? Herhangi bir htaccess dosyası bir nginx.conf dosyaya ne çevirmek için nasıl bir fikir? Ben bu araştırma yapıyorum ama birisi zaten bu ile deneyime sahip umuyorum. Teşekkürler!

EDIT: Bu akım htaccess olduğunu:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

8 Cevap

Ben oldukça eski bir konu olduğunu biliyorum ama yine de bazı insanlar yardımcı olabilir.

Temelde index.php herhangi bir 404 hata yönlendirir, ancak dosya (tip dosyası) varsa bu doğru kök koyacaktır.

Kafamın üstünden yaptım. Bu hemen çalışmıyor olabilir, ve size doğru yolu ve Fastcgi yapılandırma koymak zorunda. Bu Zend_Framework ile bu gibi çalışması gerektiği gibi ben de index.php için her şeyi geri koymak

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;
}
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;
 }
}

Bu hiç mümkün try_files kullanmanız önerilir.

Ben muhtemelen elle yapmak zorunda olacak, htaccess dosyasını dönüştürmek için herhangi bir sistematik / otomatik bir yol bilmiyorum. Nginx wiki nginx belgeler için en iyi kaynaktır.

Edit: I'm running Zend Framework on Nginx myself now and the config looks like this:

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;
  }
}

Gördüğünüz gibi, yazma kuralı kendisi çok basittir.

Yardımcı olabilecek bir sunucu evreleme için ;)

            fastcgi_param APPLICATION_ENV staging;

Bu, basit bir "resmi" ve güzel çalışıyor:

http://wiki.nginx.org/Zend_Framework#Time_for_nginx

Bootstrap gibi bir index.php: Aslında ben zend framework gibi çalışacak bir drupal sitesi ile nginx çalıştırın

Bu kural (sadece drupal üzerine, Zend Framework üzerinde test edilmemiştir, ancak benzer olmalı)

location / {
            if (!-e $request_filename) {
                    rewrite  ^/(.*)$  /index.php?q=$1  last;
                    break;
        }
    }

error_page  404              /index.php;

Eğer http://some.url/myproject/controller/ gibi proje için bir alt kullanıyorsanız, o zaman da önyükleme dosyasına setBaseUrl eklemeniz gerekir.

<?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!
    }
}

Nginx yeniden yazma gibi olacaktır:

location /myproject/ {
  if (!-e $request_filename) {
    rewrite ^/myproject/(.*)$ /index.php?$1? last;
  }
}

PS soru işareti yazım hatası değil!

O mümkünse olsaydı, ben sadece Nginx kutusundan erişilebilir standart olmayan bir port kurulum Apache ve Apache Nginx vekil var tavsiye ederim.

Nginx Proxy documentation