CakePHP 和 Nginx 配置

CakePHP and Nginx configuration

所以我的任务是使用 CakePHP 创建一个站点,所以我下载了最新的 2.2.3,我需要在我的本地 nginx 1.2.4 服务器上配置它。

我有 server_block 工作,但由于某种原因我无法加载任何 css。测试主页还报告 url 重写工作不正常。

我已经阅读了许多文章和问题,但似乎没有一个能够解决问题。到目前为止,我已经引用了

  • 在 nginx 1.0.8 子目录上运行的 Cakephp 应用程序问题
  • http://book.cakephp.org/2.0/en/installation/advanced-installation.html#pretty-urls-on-nginx
  • http://www.littlehart.net/atthekeyboard/2007/09/14/configuring-cakephp-to-work-with-nginx/
  • http://www.littlehart.net/atthekeyboard/2009/01/25/cakephp-nginx-configuration-update/
  • http://kvz.io/blog/2010/02/24/cakephp-and-nginx/

我的 css 链接看起来像这样,
<link rel="stylesheet" type="text/css" href="/Users/david/Sites/example.com/css/cake.generic.css" />

我需要弄清楚为什么 Nginx 不让我的 CSS 加载。到目前为止,我只能发现它将 $_SERVER['DOCUMENT_ROOT'] 附加到我的所有链接中,这显然意味着我的 css 将被错误地链接。我需要找出谁来阻止 cakephp 获取这些额外信息。链接被传递到 HtmlHelper 如下 string '/Users/david/Sites/example.com//Users/david/Sites/example.com/css/cake.generic.css' (length=86)

目前我的 nginx 配置服务器块如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
server {
    server_name  example.com;

    root   /Users/david/Sites/example.com/app/webroot/;

    access_log /usr/local/var/log/nginx/example.com.access.log;
    error_log /usr/local/var/log/nginx/example.com.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:9001;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SERVER_NAME example.com;
        include       fastcgi_params;
    }

    location ~ /\\.ht {
        deny  all;
    }
}

FastCGIParams

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $request_filename;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;


所以我已经设法找出问题所在。原来它是 core.php

中的一个变量

如果您将 Configure::write('App.baseUrl', env('SCRIPT_NAME')); 更改为 Configure::write('App.baseUrl', '/');,那么它似乎一切正常,并且会正确路由到您的 css 文件。

我的 nginx 配置如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
server {
    listen   127.0.0.1:80;
    server_name  example.com.ukwm157;

    root /Users/david/Sites/example.com/app/webroot;
    index index.php index.html;

    log_not_found off;
    charset utf-8;

    access_log /usr/local/var/log/nginx/example.com.access.log main;
    error_log /usr/local/var/log/nginx/example.com.error.log;

    location / {

      index index.php index.html index.htm;

      if (-f $request_filename) {
        break;
      }
      if (-d $request_filename) {
        break;
      }

      rewrite ^(.+)$ /index.php?q=$1 last;

    }

    # Static files.
    # Set expire headers, Turn off access log
    location ~* \\favicon.ico$ {
      access_log off;
      expires 1d;
      add_header Cache-Control public;
    }

    location ~ ^/(img|cjs|ccss)/ {
      access_log off;
      expires 7d;
      add_header Cache-Control public;
    }

    # Deny access to .htaccess files,
    # git & svn repositories, etc
    location ~ /(\\.ht|\\.git|\\.svn) {
      deny  all;
    }

    location ~ .php?$ {
        #if (!-e $document_root$document_uri){return 404;}
        fastcgi_pass 127.0.0.1:9001;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

}

以下配置适用于 Cake 2.x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
listen   80;
server_name myprojecy.xyz;
access_log /var/log/nginx/access.log;
error_log  /var/log/nginx/error.log;

location / {
    root   /var/www/html/project-forlder/app/webroot;
    index  index.php index.html index.htm;

    if (-f $request_filename) {
    break;
    }

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

location ~ .*\\.php[345]?$ {
    include /etc/nginx/fastcgi.conf;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    fastcgi_index   index.php;
    fastcgi_param SCRIPT_FILENAME
    /var/www/html/project-forlder/app/webroot$fastcgi_script_name;
}

}


我认为问题在于您使用的是文件路径而不是 URL。