我对 Nginx 设置有三个要求:
- 将全部请求转发到运行在端口 9001 上的 Java 服务器
- 拦截所有静态文件 URL 并通过 Nginx 本身提供服务。
- 从包含 PHP 脚本的文件夹提供特定的基本 URL。
其中,前两个我可以实现,但是当我http://localhost/ecwid_fu_scripts/
通过 Web 浏览器访问时,请求会被运行在端口 9001 上的 Java 服务器拦截,并且不会被路由到index.php
。/home/ankush/ecwid_fu_scripts/
这是我的 Nginx 配置:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location /assets/images/ {
root /home/ankush/fu_main_files/;
autoindex off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 100;
}
location /ecwid_fu_scripts/ {
index index.php;
root /home/ankush/ecwid_fu_scripts/;
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location / {
proxy_pass http://localhost:9001;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
答案1
您的问题与该root
指令以及该指令的范围有关root
。
location /ecwid_fu_scripts/ {
root /home/ankush/ecwid_fu_scripts/;
在这种情况下,当有人请求 example.com/ecwid_fu_scripts/ 时,nginx 会查找定义的 中的文件root
以及位置。这变成了 /home/ankush/ecwid_fu_scripts/ecwid_fu_scripts/,而这不是 index.php 所在的位置。
为了解决这个问题,你有两个选择(如果你对项目有自由,那么#2 是首选):
- 将该位置块更改
root
为 /home/ankush/。 - 或者重新构建项目结构,使所有内容都位于一个相对项目文件夹中。现在,将全局
root
(任何位置块之外的指令)设置为新的项目文件夹名称(假设在指令root /home/ankush/ecwid_files/;
之后server_name
)。
location ~ \.php$
现在,我们仍然需要在块内添加块的内容location /ecwid_fu_scripts/
,因为当root
更改时,与这个新根相关的内容需要在同一个块中使用。这是因为这种陷阱:ecwid_fu_scripts 的位置块表示它是一个 .php 文件,它执行 try_files,然后它以这个块结束,并发送到下一个相关块:全局location ~ \.php$
。问题是,它不知道 是什么root
了,因为它不是全局定义的。因此,此块中的 fastcgi_pass 没有获取完整路径。
因此最后,您的配置将如下所示,其中选项 #1:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location /assets/images/ {
root /home/ankush/fu_main_files/;
autoindex off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 100;
}
location /ecwid_fu_scripts/ {
index index.php;
root /home/ankush/;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location / {
proxy_pass http://localhost:9001;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
}