Zend Framework на nginx
Основанный на Zend Framework сайт, на котором я работал, теперь переносится на его производственный сервер. Этот сервер оказывается nginx (сюрприз!). Естественно, сайт работает неправильно, поскольку он был разработан на Apache и использует файл htaccess.
Мой вопрос: у кого-нибудь есть опыт? Любые идеи о том, как перевести то, что делает файл htaccess, в файл nginx.conf? Я исследую это, но надеюсь, что у кого-то уже есть опыт с этим. Спасибо!
EDIT: текущий htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]
Ответы
Ответ 1
Я знаю, что это довольно старый поток, но в любом случае это может помочь некоторым людям.
В основном он перенаправляет любую ошибку 404 в index.php, но если файл существует (файл типа), он установит правильный корень.
Я сделал это из головы. Возможно, он не работает сразу, и вам нужно установить правильный путь и fastcgi config. Я также возвращаю все обратно в index.php, так как он должен работать с 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;
}
Ответ 2
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 скриптs 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;
}
}
Рекомендуется использовать try_files, когда это возможно.
Ответ 3
Я не знаю никакого автоматического/систематического способа конвертировать htaccess файл, вам, вероятно, придется сделать это вручную. Nginx wiki - лучший ресурс для документации nginx.
Edit:
Теперь я запускаю Zend Framework на Nginx, и конфигурация выглядит так:
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 скриптs 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;
}
}
Как вы можете видеть, правило перезаписи очень просто.
Ответ 4
Это "официальный", простой и хорошо работает:
http://wiki.nginx.org/Zend_Framework#Time_for_nginx
Ответ 5
Для промежуточного сервера, который мог бы помочь;)
fastcgi_param APPLICATION_ENV staging;
Ответ 6
На самом деле я запускаю nginx с сайтом drupal, который работает как zend framework: один index.php в качестве начальной загрузки
это правило (не проверено на zend framework, просто на drupal, но должно быть похоже)
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
}
}
error_page 404 /index.php;
Ответ 7
Если вы используете подкаталог для своего проекта, например http://some.url/myproject/controller/, вам также необходимо добавить setBaseUrl в ваш файл начальной загрузки.
<?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 будет выглядеть так:
location /myproject/ {
if (!-e $request_filename) {
rewrite ^/myproject/(.*)$ /index.php?$1? last;
}
}
PS Вопросительный знак не опечатан!
Ответ 8
Если бы это было возможно, я бы рекомендовал настроить Apache на нестандартный порт, доступный только из поля Nginx, и иметь прокси Nginx для Apache.
Документация Nginx Proxy