【发布时间】:2016-11-26 00:30:09
【问题描述】:
通过一些(或非常多)试验和错误,我能够从几年前的某个地方修改我的副本和粘贴的 nginx fastcgi php 配置,以便能够在子文件夹中运行我的 php 应用程序。
但我无法解决的最后一步是如何让 nginx 将查询字符串传递给 php 以便能够访问 GET 参数。这是我的配置,最完美的只是缺少配置参数:
server {
listen 80;
server_name project.dev;
location /app/ {
alias /path/to/my/application/;
index index.php;
try_files $uri $uri/ /app/index.php;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
}
location / {
# configuration for static website
}
}
我了解到您必须将不同的选项传递给try_files 才能获取请求参数:
try_files $uri $uri/ /app/index.php$is_args$query_string;try_files $uri $uri/ /app/index.php$is_args$args;try_files $uri $uri/ /app/index.php?$query_string;
不幸的是,将其更改为其中任何一个都会导致我的 php 脚本不再被找到,因为 nginx 将请求重置为它的文档根目录:
2016/11/25 11:54:48 [error] 45809#0: *1169 open() "/usr/local/Cellar/nginx-full/1.10.2/htmlindex.php" failed (2: No such file or directory), client: 127.0.0.1, server: project.dev, request: "GET /app/myurl?test=works HTTP/2.0", host: "project.dev", referrer: "http://project.dev/app/myurl?test=works"
为fastcgi_param SCRIPT_FILENAME 提供绝对路径也不会产生相同的错误。即使在server 级别上设置root 配置也无法正常工作,因为每次都省略了路径的分隔斜线和index.php。但是(如果可能的话)我宁愿不要在服务器级别设置根目录,因为该项目由文件系统上的许多不同文件夹和应用程序组成,不共享公共目录。
【问题讨论】:
-
你想达到什么目的?
/path/to/my/application/下有哪些文件? -
我的完整应用程序保存在
/path/to/my/application/下,其中包含所有资产和 php。加载资产并运行 php 完全符合预期,但由于某种原因,我无法将 $_GET 参数传递给 fastcgi -
问题是
alias和try_files。您想在 URI/app下运行您的应用程序,如果/path/to/my/application/以/app结尾(与 URI 相同的子目录名称),事情会非常简单。 -
很遗憾,这是不可能的,因为位置
/是另一个网站,它有自己的文件系统和结构,我不允许乱用。但是try_files和alias是 完美运行:调用 PHP,发送资产 - 只有请求参数不发送到 PHP。只要我添加这些后缀以获取查询字符串,它就会走下坡路。 -
/path/to/my/application/下是否只有一个PHP文件?顺便说一句,您需要做的就是在您的文件所在的位置创建一个名为app的目录并将它们移动到其中 - 我不是要您更改/中的任何内容。