Nginx/PHP-FPM 使用多个 webroot
Nginx/PHP-FPM use more than one webroot
我遇到了 nginx 的问题。
我想区分两种情况:
首先如果请求URL匹配/api/(*.)我想returnapi/index.php
否则如果 URL 不匹配,public/index.php 必须 returned.
我尝试了几种解决方案,包括:
nginx + php-fpm. Redirect to php-script
有人可以向我解释如何实现这一目标吗?
谢谢:)
我的文件是这样组织的:
/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;
}
}
}
snippets/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;
这里是管理员-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
此配置有效:)
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;
}
}
我遇到了 nginx 的问题。
我想区分两种情况:
首先如果请求URL匹配/api/(*.)我想returnapi/index.php
否则如果 URL 不匹配,public/index.php 必须 returned.
我尝试了几种解决方案,包括:
nginx + php-fpm. Redirect to php-script
有人可以向我解释如何实现这一目标吗?
谢谢:)
我的文件是这样组织的:
/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;
}
}
}
snippets/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;
这里是管理员-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
此配置有效:)
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;
}
}