nginx没有传递fastcgi查询字符串

时间:2016-11-25 11:18:54

标签: 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;

不幸的是,由于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的分隔斜杠。但是(如果可能的话)我宁愿不在服务器级别设置根目录,因为该项目由文件系统上的许多不同文件夹和应用程序组成,不共享公共目录。

1 个答案:

答案 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