How do I configure nginx rewrite rules to get CakePHP working on CentOS?

前端 未结 6 2083
清歌不尽
清歌不尽 2021-01-31 12:42

Hi somebody please help me out, I’m trying to setup a cakephp environment on a Centos server running Nginx with Fact CGI. I already have a wordpress site running on the server a

相关标签:
6条回答
  • 2021-01-31 12:55

    I got this working:

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

    and then of course handlers for php and stuff...

    0 讨论(0)
  • 2021-01-31 12:57

    At a glance, your problem might be that you are not pointing nginx to the webroot of your app. Deploying to the root cake folder is really not the way to go under any web-server.

    The following is a complete server-block I use running Cake apps. In reality I only have the first four lines and then include the rest from a separate file "cakephp.inc".

    A note on the line "fastcgi_param SERVER_NAME $host;". This is because some of my apps use $_SERVER['SERVER_NAME'] and it does not have the same meaning in nginx as in Apache. If youe server has several server_name(s) defined nginx will always pass the first one to 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 讨论(0)
  • 2021-01-31 12:58

    Please use below code in

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

    }

    Its working for me.

    0 讨论(0)
  • 2021-01-31 13:05

    There's now official documentation on this issue, which I used and confirmed works.

    The documentation states:

    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 讨论(0)
  • 2021-01-31 13:06

    I had a bunch of issues setting up a CakePHP site that was running an older version of CakePHP 1.2 - going by the date of this post it might be around the time. I recently blogged about it and simply suggest upgrading or installing a fresh version of the Cake library and all problems went away.

    0 讨论(0)
  • 2021-01-31 13:09

    It is not advisable to use 'IF' blocks inside a 'location' block.

    Here is a more natural way to achieve the same, using regex locations.

    In this example, CakePHP 2.x is the root app on a vhost (skipping common stuff like server_name , logs 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;
        }
    

    Note that the .php location block is BEFORE the / location block. That's important because with regex locations, they are searched until the first match.

    If you need to make it run in a sublocation, eg http://www.example.com/something/, here is how I managed to do it. First I had to do a symlink to trick nginx: extract cakephp-2.x somewhere, then in 'app/webroot' create a symlink to itself with the same name as the sublocation, e.g. 'ln -s ../webroot something' .

    Then the following config works to access cackephp under /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 can probably be avoided by using 'alias' istead of 'root' but I could not figure out how.

    0 讨论(0)
提交回复
热议问题