经过一些(或很多次)试验和错误,我能够修改我几年前从某处复制和粘贴的 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
的分隔斜杠每次都被省略.但是(如果可能的话)我宁愿不在服务器级别设置根目录,因为该项目由文件系统上的许多不同文件夹和应用程序组成,不共享公共(public)目录。
最佳答案
您在 /path/to/my/app2/public
下安装了一个应用程序,并希望使用 URI /app
访问它。
假设我们可以使用 /app2/
作为内部 URI(它不会与该服务器提供的任何其他公共(public) URI 冲突 - 但重要的是不会被您的客户看到)。
您有一个 PHP 文件。
location ^~ /app {
rewrite ^/app(.*)$ /app2/public$1 last;
}
location ^~ /app2/ {
internal;
root /path/to/my;
index index.php;
try_files $uri $uri/ /app2/public/index.php$is_args$args;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /path/to/my/app2/public/index.php;
}
}
第一个 location block 简单地改变内部 URI 以匹配文档根目录(因此我们可以使用根目录而不是别名)。第二个位置 block 提供静态内容。第三个位置 block 调用 index.php
。
index.php
如何获取查询字符串取决于程序。它将使用 fastcgi_params
中定义的参数之一。通常是 REQUEST_URI 或 QUERY_STRING。无论哪种方式,都应使用上述配置保留两个变量。
^~
修饰符确保这些位置 block 优先于其他正则表达式位置 block (如果存在的话)。参见 this document了解详情。
关于php - nginx 没有传递 fastcgi 查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40803806/