Как настроить правила перезаписи nginx, чтобы CakePHP работал в CentOS?

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

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

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

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

это мой призрак

 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

С первого взгляда ваша проблема может заключаться в том, что вы не указываете 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; } } 

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

В документации указано:

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

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

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

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

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

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

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

Затем следующая конфигурация работает для доступа к cackephp под / something /:

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

Symlinking, вероятно, можно избежать, используя «псевдоним» istead из «root», но я не мог понять, как это сделать.

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

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

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

}

Он работает на меня.