【问题标题】:nginx is not passing fastcgi query stringnginx 没有传递 fastcgi 查询字符串
【发布时间】: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
  • 问题是aliastry_files。您想在 URI /app 下运行您的应用程序,如果 /path/to/my/application//app 结尾(与 URI 相同的子目录名称),事情会非常简单。
  • 很遗憾,这是不可能的,因为位置/ 是另一个网站,它有自己的文件系统和结构,我不允许乱用。但是try_filesalias 完美运行:调用 PHP,发送资产 - 只有请求参数不发送到 PHP。只要我添加这些后缀以获取查询字符串,它就会走下坡路。
  • /path/to/my/application/ 下是否只有一个 PHP 文件?顺便说一句,您需要做的就是在您的文件所在的位置创建一个名为 app 的目录并将它们移动到其中 - 我不是要您更改 / 中的任何内容。

标签: php nginx fastcgi


【解决方案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 以匹配文档根(因此我们可以使用根代替别名)。第二个位置块提供静态内容。第三个位置块调用index.php

index.php 如何获取查询字符串取决于程序。它将使用fastcgi_params 中定义的参数之一。通常是 REQUEST_URI 或 QUERY_STRING。无论哪种方式,上述配置都应保留这两个变量。

^~ 修饰符确保这些位置块优先于其他正则表达式位置块(如果存在)。详情请见this document

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多