Сайт 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]
Я знаю, что это довольно старый поток, но в любом случае это может помочь некоторым людям.
В основном он перенаправляет любую ошибку 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; }
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; } }
Рекомендуется когда-либо использовать try_files.
Я не знаю никакого автоматического / систематического способа преобразования htaccess-файла, вам, вероятно, придется это сделать вручную. Вики Nginx – лучший ресурс для документации nginx.
Изменить: теперь я запускаю 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 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; } }
Как вы можете видеть, правило перезаписи очень просто.
Это «официальный», простой и хорошо работает:
Для промежуточного сервера, который мог бы помочь;)
fastcgi_param APPLICATION_ENV staging;
На самом деле я запускаю 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;
Если вы используете подкаталог для своего проекта, например 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 Вопросительный знак не опечатал!
Если бы это было возможно, я бы рекомендовал настроить Apache на нестандартный порт, доступный только из Nginx, и иметь прокси Nginx для Apache.
Документация Nginx Proxy