nginx下如何配置cakephp 子目录

这是个很蛋疼的问题,花费了很多时间.

示例配置如下:

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
server {
listen 80;
server_name example.com;

root /usr/share/nginx/example.com;

location / {
index index.php index.html;
}

location ~ ^/subdir/(img|css|js|files)/(.+)$ {
root /usr/share/nginx/example.com/subdir/app/webroot;
try_files /$1/$2 =404;
}

location ~ ^/subdir/(.+\.php) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ ^/subdir/(.*)$ {
index index.php index.html;
try_files /subdir/$1 /subdir/$1/ /subdir/index.php?$1&$args;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

 

研究步骤:

环境:

1
2
3
4
5
Debian GNU/Linux 7.8
nginx 1.4
PHP 5.5.13
MySQL 5.5.37
CakePHP 2.4.0

目的:

我要运行一个子目录为subdir的cakephp应用程序。

因为有个主域名为http://example.com。我想用http://example.com/subdir来访问这个cakephp网站。

官方的例子:

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
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?$uri&$args;
}

location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

没有用!!

图片/js/css都是404 Not Found!

虽然设置了官方网站的例子不能用,但是它给了我们启发,在做nginx的设置,我们将着眼于细节。

第一是在服务器上下文中设置。

1
2
3
4
5
server {
listen 80;
server_name www.example.com;
rewrite ^(.*) http://example.com$1 permanent;
}

当有一个访问时,http://example.com/无法设置重定向。

看看你的服务器环境的下半部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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?$uri&$args;
}

location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

SERVER_NAME example.com;
主机是example.com访问声明正是在这样的背景下设置处理。

root /var/www/example.com/public/app/webroot/;
对应于所述URL的根路径的服务器上完整的路径将被设置。跟apache的DocumentRoot一样。

location第1部分

1
2
3
location / {
try_files $uri $uri/ /index.php?$uri&$args;
}

(内侧面说明要跨越以往的根指令{}设置生效)
个别位置上下文的行为是有点复杂。

  1. /var/www/example.com/public/app/webroot/$uri寻找一个静态文件
  2. (如果没有的话)/var/www/example.com/public/app/webroot/$uri查找名为目录
  3. (如果它也存在)/var/www/example.com/public/app/webroot/index.php?$uri&$args我在内部设置重定向
  4. $uri从已请求的URL给客户端,server_name进入串删除
  5. 例如:http://www.example.com/xxx/yyy时,会分解成:$uri = xxx/yyy
  6. 同时保留了URL参数$参数数量可变的内部重定向

location第2部分

1
2
3
4
5
6
7
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

位置上下文-放时,并获得您想要应用设置的正则表达式中可以指定。
在这种情况下,到底是的.php接入到与该位置上下文应用设置结尾的文件。

坚持原创技术分享,您的支持将鼓励我继续创作!