Фреймворк Zend на nginx
-
22-08-2019 - |
Вопрос
Сайт на базе Zend Framework, над которым я работал, в настоящее время переносится на его производственный сервер.Этим сервером оказывается nginx (сюрприз!).Естественно, сайт работает некорректно, поскольку он был разработан на Apache и полагается на файл htaccess.
Мой вопрос таков...у кого-нибудь есть какой-нибудь опыт в этом?Есть идеи о том, как перевести то, что делает файл htaccess, в файл nginx.conf?Я исследую это, но надеюсь, что у кого-то уже есть опыт работы с этим.Спасибо!
Редактировать:Это текущий 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 , но если файл существует (введите file), он установит правильный root.
Я сделал это с самого начала.Возможно, это сработает не сразу, и вам нужно указать правильный путь и конфигурацию fastcgi.Я также вернул все обратно в 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 как bootstrap
это правило (не тестировалось на 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.