我有两个应用程序:HTML+JS 前端和 PHP 后端。我想设置 Nginx,以便两者都从同一域提供服务。对后端的请求使用以 开头的 URL 发出/api
。
我的尝试是这样的:
server {
root /path/to/frontend;
index index.html;
server_name example.com;
location / {
try_files $uri $uri/ /index.html;
}
location /api {
alias /path/to/backend;
index index.php;
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
但是,对于所有对后端的请求,我最终都得到 404:主要脚本未知。
有没有办法实现我在这里尝试做的事情?怎么做?
答案1
你犯了一个常见的错误,人们并不真正了解 nginx 的工作原理。请记住以下内容:
nginx 总是使用单身的 location
仅阻止。
我建议您(重新)阅读以下内容:nginx 如何处理请求
现在,查看您的配置,后端请求需要由 2 个位置提供服务:
location /api
location ~\.php$
下列的location
文档中,第一个被称为字首位置,而第二个是正则表达式(正则表达式)一。nginx 将检查两者,但最终只会选择一个,在您的情况下是正则表达式。
现在,在处理它时,nginx 会将 的请求转发/path/to/frontend/<yourFile>.php
给 PHP,从 构建路径root /path/to/frontend
,因为这是唯一定义的路径。然后后端失败,无法找到指定的文件。
您可能希望尝试以下操作:
location /api {
alias /path/to/backend;
index index.php;
try_files $uri $uri/ /index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
# Useless? Request always ending up with '.php' here...
fastcgi_index index.php;
include fastcgi_params;
# Try to secure this block, which might lead to arbitrary code execution.
}
}
至于缺乏安全性,我在 2014 年 10 月底的 nginx.conf 上主持了一场关于 nginx 和 PHP-FPM 的演讲。幻灯片如下:https://rosset.net/LAMP_just_died.pptx. 视频即将发布。