2009-06-25 2 views
9

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

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

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 ищет свои файлы, чтобы служить, но у меня есть торт установлен в частном порядке с линком в общественном связывании обратно/частный/торт/

это мой ВХост

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

ответ

9

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

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

Заметка на строке "fastcgi_param SERVER_NAME $ host;". Это связано с тем, что некоторые из моих приложений используют $ _SERVER ['SERVER_NAME'], и он не имеет такого же значения в nginx, что и в Apache. Если у вас сервер имеет несколько имен сервера (ов), то 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; 
    } 
} 
+0

Мартин благодарит вас за ввод, я задал тот же вопрос, что и на сайте сестры SE, а также некоторые ответы, которые могут вас заинтересовать http://serverfault.com/questions/32070/cakephp-nginx-config-rewrite- rules – 2009-07-09 17:42:42

3

Я получил эту работу:

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 и прочего ...

7

Там теперь official documentation on this issue, который я использовал и подтвердил работу.

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

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

Бросив это здесь как «я тоже» - я сделал это более одного раза, обратите внимание, что корень указывает на подкаталог WEBROOT, а не на каталог корневого торта. В противном случае все биты торта работают нормально, но не загружаются статические файлы и т. Д. –

0

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

0

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

VI/и т.д./Nginx/сайтов-доступных/имя_домена.ком

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

}

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

2

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

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

В этом примере, CakePHP 2.x является корнем приложения на виртуальный хост (пропуская общие вещи, как server_name, журналы и т.д.):

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 расположение ПЕРЕД/блок местоположения. Это важно, потому что с регулярными выражениями они обыскиваются до первого совпадения.

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

Затем следующие конфигурации работает, чтобы получить доступ к cackephp в/что-то /:

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

символической ссылки, вероятно, может быть избежать с помощью istead «псевдоним» в «корне», но я не мог понять, каким образом.

Смежные вопросы