Nginx - 根目录在其他目录中的位置 PHP
Nginx - location with root in other directory and PHP
我尝试使用 Nginx 设置一个类似于 "Apache Alias" 的位置,但我无法处理此文件夹中的 PHP 脚本。
这是我的文件夹结构(针对 Dev 环境):
/var/www
+- dev/public/ <-- This is my normal Web root : "/"
| +- assets/
| | +- app.css
| | +- app.js
| |
| +- index.php
| +- favicon.png
|
+- cut/public/ <-- This must like an "Apache Alias" : "/cut"
+- assets/
| +- app.css
| +- app.js
|
+- index.php
+- other_other_file.php (why not)
我尝试了不同的解决方案,但其中 none 有效。
这是我最好的 Nginx 配置:
server {
listen 80;
server_name _;
root /var/www/dev/public/;
index index.php index.html;
autoindex on;
# Logs
rewrite_log on;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
# Serving files
location / {
try_files $uri $uri/ @php;
}
location /cut {
root /var/www/cut/public;
try_files $uri $uri/ @php;
}
# PHP
location @php {
rewrite ^(.*)/?$ /index.php$is_args$args last;
}
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
有了这个,我的 cut/public/
文件夹的所有内容都被重定向到 dev/public/index.php
并被解释(我认为是 try_file
的原因)。
这就是我们欢迎您提供帮助的原因。
最终解决方案
在@richard-smith 的回答后,这里是实现的解决方案:
server {
listen 80;
server_name _;
root /var/www/dev/public/;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location ^~ /cut {
rewrite ^/cut/?(.*)$ /cut/public/ last;
}
location ^~ /cut/public {
root /var/www/;
try_files $uri $uri/ /cut/index.php$is_args$args;
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
运行 两个 PHP 应用程序并排,您需要一个共同的文档根目录,或者您需要两个 location ~* \.php
(或类似)块以确保正确的 SCRIPT_FILENAME
被发送到fastcgi后端。
使用嵌套的location
块来隔离/cut
子目录,并在顶层使用^~
修饰符来避免其他顶层正则表达式location
块来自干扰(参见 this documentation)。
alias
指令(参见 this documentation)用于将 /cut
映射到 /var/www/cut/public
。 root
指令只能连接,这会使 /var/www/cut/public/cut
(你不想要)。
但是,我不建议将 alias
指令与 try_files
指令一起使用,因为 this long term issue.
因此,一个解决方案是默默地将 /cut
重写为 /cut/public
并使用值 root /var/www
.
例如:
location ^~ /cut {
rewrite ^/cut(.*)$ /cut/public last;
}
location ^~ /cut/public {
root /var/www;
try_files $uri $uri/ /cut/index.php$is_args$args;
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
我尝试使用 Nginx 设置一个类似于 "Apache Alias" 的位置,但我无法处理此文件夹中的 PHP 脚本。
这是我的文件夹结构(针对 Dev 环境):
/var/www
+- dev/public/ <-- This is my normal Web root : "/"
| +- assets/
| | +- app.css
| | +- app.js
| |
| +- index.php
| +- favicon.png
|
+- cut/public/ <-- This must like an "Apache Alias" : "/cut"
+- assets/
| +- app.css
| +- app.js
|
+- index.php
+- other_other_file.php (why not)
我尝试了不同的解决方案,但其中 none 有效。
这是我最好的 Nginx 配置:
server {
listen 80;
server_name _;
root /var/www/dev/public/;
index index.php index.html;
autoindex on;
# Logs
rewrite_log on;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
# Serving files
location / {
try_files $uri $uri/ @php;
}
location /cut {
root /var/www/cut/public;
try_files $uri $uri/ @php;
}
# PHP
location @php {
rewrite ^(.*)/?$ /index.php$is_args$args last;
}
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
有了这个,我的 cut/public/
文件夹的所有内容都被重定向到 dev/public/index.php
并被解释(我认为是 try_file
的原因)。
这就是我们欢迎您提供帮助的原因。
最终解决方案
在@richard-smith 的回答后,这里是实现的解决方案:
server {
listen 80;
server_name _;
root /var/www/dev/public/;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location ^~ /cut {
rewrite ^/cut/?(.*)$ /cut/public/ last;
}
location ^~ /cut/public {
root /var/www/;
try_files $uri $uri/ /cut/index.php$is_args$args;
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
运行 两个 PHP 应用程序并排,您需要一个共同的文档根目录,或者您需要两个 location ~* \.php
(或类似)块以确保正确的 SCRIPT_FILENAME
被发送到fastcgi后端。
使用嵌套的location
块来隔离/cut
子目录,并在顶层使用^~
修饰符来避免其他顶层正则表达式location
块来自干扰(参见 this documentation)。
alias
指令(参见 this documentation)用于将 /cut
映射到 /var/www/cut/public
。 root
指令只能连接,这会使 /var/www/cut/public/cut
(你不想要)。
但是,我不建议将 alias
指令与 try_files
指令一起使用,因为 this long term issue.
因此,一个解决方案是默默地将 /cut
重写为 /cut/public
并使用值 root /var/www
.
例如:
location ^~ /cut {
rewrite ^/cut(.*)$ /cut/public last;
}
location ^~ /cut/public {
root /var/www;
try_files $uri $uri/ /cut/index.php$is_args$args;
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}