Как настроить правила перезаписи nginx, чтобы CakePHP работал на CentOS? - PullRequest
9 голосов
/ 26 июня 2009

Привет, кто-нибудь, пожалуйста, помогите мне, я пытаюсь настроить среду CakePHP на сервере Centos с Nginx и Fact CGI. У меня уже есть сайт WordPress, работающий на сервере, и сайт phpmyadmin, поэтому я правильно настроил PHP.

Моя проблема в том, что я не могу правильно настроить правила перезаписи в моем vhost, чтобы торт правильно отображал страницы, то есть со стилем и так далее. Я как можно больше гуглил, и главный консенсус сайтов, подобных приведенному ниже, заключается в том, что мне нужно иметь следующее правило перезаписи

location / {
          root   /var/www/sites/somedomain.com/current;
          index  index.php index.html;

          # If the file exists as a static file serve it 
          # directly without running all
          # the other rewrite tests on it
          if (-f $request_filename) { 
            break; 
          }
          if (!-f $request_filename) {
            rewrite ^/(.+)$ /index.php?url=$1 last;
            break;
          }
        }

http://blog.getintheloop.eu/2008/4/17/nginx-engine-x-rewrite-rules-for-cakephp

проблема в том, что эти переписывания предполагают, что вы запускаете торт прямо из руткита, что я не хочу делать. У меня есть стандартная настройка для каждого сайта, то есть одна папка на сайт, содержащая следующие папки журнала, резервные копии, частные и публичные. Публичное существо, где nginx ищет свои файлы для обслуживания, но у меня установлен приватный торт с символической ссылкой в ​​публичной ссылке на / private / cake /

это мой vhost

server {
            listen      80;
            server_name app.domain.com;

            access_log /home/public_html/app.domain.com/log/access.log;
            error_log /home/public_html/app.domain.com/log/error.log;

  #configure Cake app to run in a sub-directory
  #Cake install is not in root, but elsewhere and configured
  #in APP/webroot/index.php**

                location /home/public_html/app.domain.com/private/cake {
                index index.php;

    if (!-e $request_filename) {
        rewrite ^/(.+)$ /home/public_html/app.domain.com/private/cake/$1 last;
        break;
    }
}

                location /home/public_html/app.domain.com/private/cake/ {
                index index.php;

    if (!-e $request_filename) {
        rewrite ^/(.+)$ /home/public_html/app.domain.com/public/index.php?url=$1 last;
        break;
        }
}

         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME /home/public_html/app.domain.com/private/cake$fastcgi_script_name;
            include        /etc/nginx/fastcgi_params;
        }

 }

Теперь, как я уже сказал, я вижу основной index.php торта и подключил его к моей БД, но эта страница не имеет стилизации, поэтому, прежде чем продолжить, я бы хотел настроить ее правильно. Что я делаю не так?

Спасибо, seanl

Ответы [ 6 ]

9 голосов
/ 09 июля 2009

На первый взгляд, ваша проблема может заключаться в том, что вы не указываете nginx на webroot своего приложения. Развертывание в корневой папке тортов - это не то, что нужно для любого веб-сервера.

Ниже приведен полный блок сервера, который я использую для запуска приложений Cake. В действительности у меня есть только первые четыре строки, а затем я включаю остальные из отдельного файла "cakephp.inc".

Примечание в строке "fastcgi_param SERVER_NAME $ host;". Это связано с тем, что некоторые из моих приложений используют $ _SERVER ['SERVER_NAME'] и не имеют такого же значения в nginx, как в Apache. Если у вас есть несколько определенных server_name (ов), nginx всегда передаст первый php.

server { 
    server_name  cakeapp.example.com;
    root   /var/www/vhosts/cake/app/webroot;
    access_log  /var/log/nginx/cakeapp.access.log;
    error_log   /var/log/nginx/cakeapp.error.log;

    listen       80;
    rewrite_log on;

    # rewrite rules for cakephp
    location / {
        index  index.php index.html;

        # If the file exists as a static file serve it 
        # directly without running all
        # the other rewite tests on it
        if (-f $request_filename) { 
            break; 
        }
        if (!-f $request_filename) {
            rewrite ^/(.+)$ /index.php?url=$1 last;
            break;
        }
    }

    location ~* \favicon.ico$ {
        expires 6m;
    }
    location ~ ^/img/ { 
        expires 7d; 
    } 

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SERVER_NAME $host;
    }

    location ~ /\.ht {
        deny  all;
    }
}
7 голосов
/ 16 августа 2011

Там сейчас официальная документация по этому вопросу , которую я использовал и подтвердил работами.

В документации говорится:

server {
  listen   80;
  server_name www.example.com;
  rewrite ^(.*) http://example.com$1 permanent;
}

server {
  listen   80;
  server_name example.com;

  # root directive should be global
  root   /var/www/example.com/public/app/webroot/;
  index  index.php;

  access_log /var/www/example.com/log/access.log;
  error_log /var/www/example.com/log/error.log;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index   index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}
3 голосов
/ 16 июня 2010

У меня это работает:

root DIR/app/webroot/;
location / {
    index index.php index.html;
    rewrite ^/$ /index.php?url=/;
    if (!-e $request_filename) {
        rewrite ^(/.*)$ /index.php?url=$1 last;
    }
}

и, конечно, обработчики для php и прочего ...

2 голосов
/ 12 февраля 2015

Не рекомендуется использовать блоки 'IF' внутри блока 'location'.

Вот более естественный способ добиться того же, используя местоположения регулярных выражений.

В этом примере CakePHP 2.x является корневым приложением на vhost (пропуская такие общие вещи, как имя_сервера, журналы и т. Д.):

 root   /path/to/cakephp-2.x_root/app/webroot;
 index index.php;

 location ~ .+\.php$ {
        try_files $uri =404; #handle requests for missing .php files
        include        fastcgi_params;
        fastcgi_pass   127.0.0.1:7001; #the FPM pool port
    }


    location ~ ^/(.*) {
        try_files $uri $uri/ /index.php?url=$1&$args;
    }

Обратите внимание, что блок местоположения .php ДО блока / location. Это важно, потому что в регулярных выражениях они ищутся до первого совпадения.

Если вам нужно запустить его в подобласти, например, http://www.example.com/something/,, вот как мне удалось это сделать. Сначала мне нужно было создать символическую ссылку, чтобы обмануть nginx: где-нибудь извлечь cakephp-2.x, а затем в «app / webroot» создать символическую ссылку на себя с тем же именем, что и в расположении, например. 'ln -s ../webroot что-то'.

Тогда следующий конфиг работает для доступа к cackephp в /thing /:

    location ~ ^/something/.+\.php$ {
        try_files $uri =404; #handle requests for missing .php files
        root /path/to/cakephp-2.x_root/app/webroot;
        include        fastcgi_params;
        fastcgi_pass   127.0.0.1:7001; #the FPM pool port
    }

    location ~ ^/something(?:/)(.*) {
        root /path/to/cakephp-2.x_root/app/webroot;
        index index.php;
        try_files $uri $uri/ /something/index.php?url=$1&$args;
    }

Символьных ссылок, вероятно, можно избежать, используя 'псевдоним' вместо 'root', но я не мог понять, как.

0 голосов
/ 09 декабря 2014

Пожалуйста, используйте ниже код в

vi /etc/nginx/sites-available/domainname.com

server { 
server_name  cakeapp.example.com;
root   /var/www/vhosts/cake/app/webroot;
access_log  /var/log/nginx/cakeapp.access.log;
error_log   /var/log/nginx/cakeapp.error.log;

listen       80;
rewrite_log on;

# rewrite rules for cakephp
location / {
    index  index.php index.html;

    # If the file exists as a static file serve it 
    # directly without running all
    # the other rewite tests on it
    if (-f $request_filename) { 
        break; 
    }
    if (!-f $request_filename) {
        rewrite ^/(.+)$ /index.php?url=$1 last;
        break;
    }
}

location ~* \favicon.ico$ {
    expires 6m;
}
location ~ ^/img/ { 
    expires 7d; 
} 

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SERVER_NAME $host;
}

location ~ /\.ht {
    deny  all;
}

}

Это работает для меня.

0 голосов
/ 15 сентября 2012

У меня была куча проблем при настройке сайта CakePHP, на котором работала более старая версия CakePHP 1.2 - к дате этого поста это может быть примерно в то время. Недавно я написал в блоге об этом и просто предложил обновить или установить новую версию библиотеки Cake, и все проблемы исчезли.

...