3 votes

règles de configuration/réécriture cakephp & nginx

J'ai posé cette question sur stackoverflow mais je n'ai pas eu beaucoup de réponses et je me demandais si c'était de la programmation ou un problème de serveur.

J'essaie de mettre en place un environnement cakephp sur un serveur Centos fonctionnant avec Nginx et Fact CGI. J'ai déjà un site wordpress qui tourne sur le serveur et un site phpmyadmin donc j'ai configuré PHP correctement.

Le problème est que je n'arrive pas à configurer correctement les règles de réécriture dans mon serveur virtuel pour que cake rende les pages correctement, c'est à dire avec le style et ainsi de suite. J'ai cherché autant que possible sur Google et le consensus principal sur les sites comme celui listé ci-dessous est que je dois avoir la règle de réécriture suivante en place

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

Le problème est que ces réécritures supposent que vous exécutiez cake directement à partir du webroot, ce 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 : log, backup, private et public. Public est l'endroit où nginx cherche ses fichiers à servir, mais j'ai installé cake dans private avec un lien symbolique dans public qui renvoie à /private/cake/.

Voici mon serveur virtuel

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 l'index.php principal de cake et je l'ai connecté à ma base de données, mais cette page n'a pas de style, donc avant de continuer, j'aimerais la configurer correctement. Qu'est-ce que je fais de travers ? .

Merci Seanl

3voto

mirod Points 10845

Pour une méthode très simple et qui fonctionne avec cakephp (ce que j'ai fait pour que cela fonctionne, à ajouter à la collection de configs)

server {
    listen 80;
    server_name _;
    root /var/www/webapplication/app/webroot;

    if (-f $request_filename) {
        break;
    }
    if (!-f $request_filename) {
        rewrite ^/(.+)$ /index.php?url=$1 last;
        break;
    }

    location /favicon.ico {
        empty_gif;
    }

    location ~ .php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include /usr/nginx/conf/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/webapplication/app/webroot/index.php;
        # $fastcgi_script_name;
    }

}

0voto

hegemon Points 155

Votre fichier php est capturé par l'emplacement "~ .php$" et c'est le seul qui fonctionne.

Cela ne fonctionnera pas :

location /home/public_html/app.domain.com/private/cake/

parce que vous indiquez le chemin d'accès au système et que vous devriez indiquer le chemin d'accès à l'URI. Il en va de même pour les règles de réécriture. Je vois que votre configuration ressemble à celle d'Apache :) donc c'est peut-être quelque chose que vous devez rechercher :

location /root_of_my_site {
   alias home/public_html/app.domain.com/...
}

0voto

Chuck Robbins Points 21
location /cake {
    try_files   $uri  $uri/  @cakephp;
}

location = @cakephp {
    fastcgi_param  SCRIPT_FILENAME /home/public_html/app.domain.com/private/cake/index.php;
    fastcgi_param  QUERY_STRING url=$request_uri;
    fastcgi_pass   127.0.0.1:9000;
    include        /etc/nginx/fastcgi_params;
}

Cela suppose que vous accédez à cakephp via http://apps.server.com/cakephp et j'ai nginx 0.7.x.

Si vous avez nginx 0.6.x, utilisez error_page 404 = @cakephp au lieu de try_files .

Bonne chance !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X