通过一些(或非常多)试验和错误,我能够修改我的副本并从几年前的某个地方粘贴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;
不幸的是,由于nginx将请求重置为它的文档根目录,因此将其更改为以下任何结果都会导致我的php脚本无法找到:
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
提供绝对路径不会产生同样的错误。即使在root
级别上设置server
配置也无法正常工作,因为每次都会省略路径和index.php
的分隔斜杠。但是(如果可能的话)我宁愿不在服务器级别设置根目录,因为该项目由文件系统上的许多不同文件夹和应用程序组成,不共享公共目录。
答案 0 :(得分:1)
您已在/path/to/my/app2/public
下安装了应用,并希望使用URI /app
访问该应用。
假设我们可以使用/app2/
作为内部URI(不会与此服务器提供的任何其他公共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;
}
}
第一个位置块只是改变内部URI以匹配文档根(因此我们可以使用root而不是别名)。第二个位置块提供静态内容。第三个位置块调用index.php
。
index.php
如何获取查询字符串取决于程序。它将使用fastcgi_params
中定义的参数之一。通常是REQUEST_URI或QUERY_STRING。无论哪种方式,都应使用上述配置保留这两个变量。
^~
修饰符可确保这些位置块优先于其他正则表达式位置块(如果存在)。有关详细信息,请参阅this document。