9

嗨,有人请帮帮我,我正在尝试在使用 Fact CGI 运行 Nginx 的 Centos 服务器上设置 cakephp 环境。我已经在服务器上运行了一个 wordpress 站点和一个 phpmyadmin 站点,所以我正确配置了 PHP。

我的问题是我无法在我的虚拟主机中正确设置重写规则,以便蛋糕正确呈现页面,即样式等。我已经尽可能多地在谷歌上搜索,下面列出的网站的主要共识是我需要制定以下重写规则

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 中运行 cake,这不是我想要做的。我对每个站点都有一个标准设置,即每个站点一个文件夹,其中包含以下文件夹日志、备份、私人和公共。公共场所 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;
        }

 }

现在就像我说的那样,我可以看到 cake 的主要 index.php 并将其连接到我的数据库,但是这个页面没有样式,所以在我继续之前,我想正确配置它。我究竟做错了什么?

谢谢海尔

4

6 回答 6

9

乍一看,您的问题可能是您没有将 nginx 指向应用程序的 webroot。部署到根 cake 文件夹实际上不是任何 Web 服务器下的方法。

以下是我用来运行 Cake 应用程序的完整服务器块。实际上,我只有前四行,然后从单独的文件“cakephp.inc”中包含其余行。

关于“fastcgi_param SERVER_NAME $host;”行的注释。这是因为我的一些应用程序使用 $_SERVER['SERVER_NAME'] 并且它在 nginx 中的含义与在 Apache 中的含义不同。如果你的服务器定义了多个 server_name(s),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;
    }
}
于 2009-07-09T07:41:45.543 回答
7

现在有关于这个问题的官方文档,我使用并确认了它的作品。

该文档指出:

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;
  }
}
于 2011-08-16T00:13:30.347 回答
4

我得到了这个工作:

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和其他东西的处理程序......

于 2010-06-15T22:15:22.613 回答
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”中创建一个与子位置同名的符号链接,例如“ln -s ../webroot something” .

然后以下配置可以访问 /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;
    }

通过使用“别名”而不是“根”可能可以避免符号链接,但我不知道如何。

于 2015-02-12T10:48:22.923 回答
0

请使用下面的代码

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

}

它为我工作。

于 2014-12-09T06:06:22.370 回答
0

我在设置一个运行旧版本 CakePHP 1.2 的 CakePHP 站点时遇到了很多问题 - 到这篇文章的日期为止,它可能已经差不多了。我最近写了一篇关于它的博客,只是建议升级或安装新版本的 Cake 库,所有问题都消失了。

于 2012-09-15T17:42:59.770 回答