Nginx / PHP-FPM使用多个webroot

时间:2017-08-14 19:10:59

标签: php nginx fpm

我遇到了nginx的问题。

我想区分两种情况:

  • 首先,如果请求URL与/ api /(*。)匹配,我想返回api / index.php

  • 否则,如果网址不匹配,则必须返回public / index.php。

我尝试了几种解决方案,包括:

有人可以解释我如何实现这个目标吗?

Thx:)

我的文件组织如下:

/var/www/html
|
_ api
|   |
|   _ index.php
|
|_ public
    |
     _ index.php
    |
    _ js
      |
      _ index.js

这是我的服务器配置:

    server {
            listen 80;
            server_name _;

            index index.php;
            rewrite_log on;


            location / {

                    root /var/www/html/public;
                    try_files $uri $uri/ /index.php$is_args$args;

                    location ~ \.php {

                            include snippets/fastcgi-php.conf;
                            fastcgi_pass unix:/run/php/php7.1-fpm.sock;
                    }

            }

            location ^~ /api {

                    root /var/www/html/api;
                    try_files $uri $uri/ /index.php$is_args$args;

                    error_log /var/log/nginx/admin-error.log debug;

                    location ~ \.php {

                            include snippets/fastcgi-php.conf;
                            fastcgi_pass unix:/run/php/php7.1-fpm.sock;
                    }
            }
    }

片段内容/ fastcgi-php.conf:

# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

这是admin-error.log文件:

2017/08/14 18:53:31 [debug] 20331#20331: *75 http cl:-1 max:1048576
2017/08/14 18:53:31 [debug] 20331#20331: *75 rewrite phase: 3
2017/08/14 18:53:31 [debug] 20331#20331: *75 post rewrite phase: 4
2017/08/14 18:53:31 [debug] 20331#20331: *75 generic phase: 5
2017/08/14 18:53:31 [debug] 20331#20331: *75 generic phase: 6
2017/08/14 18:53:31 [debug] 20331#20331: *75 generic phase: 7
2017/08/14 18:53:31 [debug] 20331#20331: *75 access phase: 8
2017/08/14 18:53:31 [debug] 20331#20331: *75 access phase: 9
2017/08/14 18:53:31 [debug] 20331#20331: *75 access phase: 10
2017/08/14 18:53:31 [debug] 20331#20331: *75 post access phase: 11
2017/08/14 18:53:31 [debug] 20331#20331: *75 try files phase: 12
2017/08/14 18:53:31 [debug] 20331#20331: *75 http script var: "/api"
2017/08/14 18:53:31 [debug] 20331#20331: *75 trying to use file: "/api" 
"/var/www/html/api/api"
2017/08/14 18:53:31 [debug] 20331#20331: *75 http script var: "/api"
2017/08/14 18:53:31 [debug] 20331#20331: *75 trying to use dir: "/api" 
"/var/www/html/api/api"
2017/08/14 18:53:31 [debug] 20331#20331: *75 http script copy: "/index.php"
2017/08/14 18:53:31 [debug] 20331#20331: *75 http script var: ""
2017/08/14 18:53:31 [debug] 20331#20331: *75 trying to use file: 
"/index.php" "/var/www/html/api/index.php"
2017/08/14 18:53:31 [debug] 20331#20331: *75 internal redirect: 
"/index.php?"


nginx version: nginx/1.12.1

1 个答案:

答案 0 :(得分:0)

此配置有效:)

server {

    listen 80;
    server_name _;

    index index.php;
    rewrite_log on;

    root /var/www/html;


    location / {

        try_files $uri /public/index.php$is_args$args;
    }

    location ^~ /api {

        try_files $uri /api/index.php$is_args$args;

        location ~ \.php {

            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.1-fpm.sock;
        }

    }

    location ~ \.php {

        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.1-fpm.sock;
    }
}