2009-06-25 12 views
9

Salut à quelqu'un s'il vous plaît aidez-moi, je suis en train d'installer un environnement cakephp sur un serveur Centos exécutant Nginx avec Fact CGI. J'ai déjà un site wordpress fonctionnant sur le serveur et un site phpmyadmin donc j'ai PHP configuré correctement. Mon problème est que je ne peux pas obtenir l'installation correcte des règles de réécriture dans mon vhost de sorte que le gâteau rende les pages correctement, c'est-à-dire avec le style et ainsi de suite. J'ai googlé autant que possible et le consensus principal à partir des sites comme celui ci-dessous est que je dois avoir la règle suivante en placeComment configurer les règles de réécriture de nginx pour que CakePHP fonctionne sur 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; 
      } 
     } 
problème

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

est ces Rewrite assumer exécuter le gâteau directement hors de la webroot qui n'est pas ce que je veux faire. J'ai une configuration standard pour chaque site, c'est-à-dire un dossier par site contenant les dossiers suivants: journal, sauvegarde, privé et public. être public où nginx est à la recherche de ses fichiers pour servir, mais j'ai gâteau installé en privé avec un lien symbolique dans la liaison publique de retour à// privé gâteau/

ceci est mon 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; 
     } 

} 

Maintenant, comme je l'ai dit Je peux voir le index.php principal de gâteau et l'ai relié à ma DB mais cette page est sans styler ainsi avant que je continue plus loin je voudrais le configurer correctement. Qu'est-ce que je fais mal?

Merci seanl

Répondre

9

En bref, votre problème pourrait être que vous ne pointez pas nginx à l'Webroot de votre application. Déployer dans le dossier du gâteau racine n'est vraiment pas le moyen d'aller sous n'importe quel serveur Web.

Ce qui suit est un bloc de serveur complet J'utilise des applications de gâteau en cours d'exécution. En réalité, je n'ai que les quatre premières lignes et ensuite inclure le reste d'un fichier séparé "cakephp.inc".

Une note sur la ligne "fastcgi_param SERVER_NAME $ host;". En effet, certaines de mes applications utilisent $ _SERVER ['SERVER_NAME'] et n'ont pas la même signification dans nginx que dans Apache. Si votre serveur a plusieurs nom (s) serveur (s) définis, nginx transmettra toujours le premier à 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

Martin merci pour votre contribution, j'ai posé la même question sur SO sur le site SErver et j'ai eu des réponses qui pourraient vous intéresser http://serverfault.com/questions/32070/cakephp-nginx-config-rewrite- règles –

3

J'ai eu ce travail:

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

et des gestionnaires de cours pour php et tout ça ...

7

Il y a maintenant official documentation on this issue, que je et confirmé les travaux.

Les états de documentation:

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

En jetant ceci ici comme un "moi aussi" - je l'ai fait plus d'une fois maintenant, notez que la racine pointe vers le sous-répertoire WEBROOT, pas le répertoire racine du gâteau. Sinon, tous les bits du gâteau fonctionnent correctement, mais aucun fichier statique ne se charge, etc. –

0

moi avons eu un tas de questions mise en place d'un site CakePHP qui exécutait une ancienne version de CakePHP 1.2 - aller à la date de ce poste, il pourrait être à l'époque. Récemment, j'ai suggéré de mettre à jour ou d'installer une nouvelle version de la bibliothèque Cake et tous les problèmes ont disparu.

0

S'il vous plaît utiliser ci-dessous le code dans

vi/etc/nginx/sites disponibles/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; 
} 

}

Son travail pour moi.

2

Il est déconseillé d'utiliser des blocs 'IF' dans un bloc 'location'.

Voici une manière plus naturelle d'obtenir la même chose, en utilisant des emplacements regex.

Dans cet exemple, CakePHP 2.x est l'application racine sur un serveur virtuel (sauter des choses communes comme nom_serveur, journaux, etc.):

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

Notez que le bloc d'emplacement .php est AVANT le/bloc d'emplacement. C'est important car avec les emplacements regex, ils sont recherchés jusqu'au premier match.

Si vous devez le faire fonctionner dans une sous-location, par exemple http://www.example.com/something/, voici comment j'ai réussi à le faire. D'abord, j'ai dû faire un lien symbolique pour tromper nginx: extraire cakephp-2.x quelque part, puis dans 'app/webroot' créer un lien symbolique vers lui-même avec le même nom que la sous-location, par exemple. 'ln -s ../webroot quelque chose'.

Ensuite, la configuration fonctionne suivant pour accéder cackephp sous/quelque chose /:

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

probablement un lien symbolique peut être évité en utilisant la istead 'alias « root », mais je ne pouvais pas comprendre comment.

Questions connexes