cakephp 和 nginx 配置/重写规则

cakephp 和 nginx 配置/重写规则

嗨,有人请帮帮我,我也在 stackoverflow 上问过这个问题,但没有得到太多回复,并且在争论这是否与编程或服务器有关。

我正在尝试在运行 Nginx 和 Fact CGI 的 Centos 服务器上设置 cakephp 环境。我已经在服务器上运行了一个 wordpress 网站和一个 phpmyadmin 网站,因此我已正确配置了 PHP。

我的问题是,我无法在虚拟主机中正确设置重写规则,以便 Cake 能够正确呈现页面(例如样式等)。我尽可能多地在 Google 上搜索,来自以下网站的主要共识是,我需要设置以下重写规则

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,而这并不是我想要的。我为每个站点设置了一个标准设置,即每个站点一个文件夹,其中包含以下文件夹:log、backup、private 和 public。public 是 nginx 寻找其文件来提供服务的地方,但我在 private 中安装了 cake,并在 public 中有一个符号链接,链接回 /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 并将其连接到我的数据库,但此页面没有样式,因此在继续操作之前,我想正确配置它。我做错了什么……

谢谢 seanl

答案1

对于使用 cakephp 的非常简单/干净且有效的方法。(我做了什么来使其工作,将其添加到配置集合中)

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

}

答案2

您的 php 文件被“~.php$”位置捕获,并且它是唯一可以运行的文件。

这不会起作用:

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

因为您给出了系统路径,所以您应该给出 URI 路径。重写规则也一样。我看到您的配置类似于 apache :) 所以这可能是您要寻找的东西:

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

答案3


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

假设你通过以下方式访问 cakephphttp://apps.server.com/cakephp并且有nginx 0.7.x。

如果您有 nginx 0.6.x,请使用error_page 404 = @cakephp而不是try_files

祝你好运!

相关内容