php - nginx 没有传递 fastcgi 查询字符串

标签 php nginx fastcgi

经过一些(或很多次)试验和错误,我能够修改我几年前从某处复制和粘贴的 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/

相关文章:

nginx - 基于 TCP 负载的动态服务器集的一致性哈希

php - 将数据从 Laravel 传递到 Bootstrap 模式

python - 使用 gunicorn 和 nginx 部署 aiohttp.web 应用程序

javascript - Recurly.js - PHP 客户端 - 数字签名

http - 使用 Nginx/Lua 检测 HTTP 基本用户/密码 header 并将其重写为自定义 header

apache - Hostmonster apache fcgi 上的 Redmine 2 : Rails application failed to start properly

apache - Apache2 的 FPM 不工作(权限被拒绝)

.htaccess - 在 fastcgi 的 codeigniter 上强制使用 https

php - 如何在 PDO 中将查询结果检索为数组?

php - Codeception 设置 session 变量