Nginx 可以在别名内处理 php(或类似的 fcgi)请求吗?

Nginx 可以在别名内处理 php(或类似的 fcgi)请求吗?

我正在将旧的 Apache 服务器转换为 Nginx,并且没有能力更改 URL 或重新排列文件系统。

是否可以在 Nginx 配置中使用嵌套的 location{} 块来告诉它当正常提供静态内容时将别名目录中的 .php 文件提供给 fastcgi?

与我失败的配置类似:

server {
  listen 80;

  location / {
    index  index.html;
  }

  location /foosite/ {
    alias  /var/aliases/foo;
    location ~ \.php$ {
      include fastcgi_params;
      fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
  }
}

/foosite/static.jpg 的请求可以正常处理,但是当 nginx 尝试将它们发送到 fastcgi 时,它似乎会混淆所有 .php 文件的路径。

答案1

这里提供的解决方案不是一个解决方案。而且它不再正确。使用 Lucid (10.4),我能够使用此解决方案。womble 的解决方案的问题在于它没有DOCUMENT_ROOT正确设置参数;相反,它在 document_root 中包含了脚本名称。

看来这工作正常。

location /foosite {
    alias /home/foosite/www/;
    index index.php index.html index.htm;

    location ~ /foosite/(.*\.php)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$1;
        include /etc/nginx/fastcgi_params;            
    }                                                 
}

使用nginx/0.7.65

答案2

据我所知,您所说的“乱码”是 nginx 中的一个错误,与嵌套位置块有关(或者可能是位置块中的别名,它们在没有捕获的情况下执行基于正则表达式的匹配……我不确定)。但是,我能做的相当简单。
首先,您可以将所有 fastcgi 参数(包括行fastcgi_pass和)fastcgi_param SCRIPT_FILENAME $request_filename放入单独的文件中,以包含在站点的相关部分中。我把我的放在了 中/etc/nginx/fragments/php

然后,对于/foosite,您需要两个位置块,如下所示:

location /foosite {
    alias /var/aliases/foo;
}

location /foosite(.*\.php)$ {
    alias /var/aliases/foo$1;
    include /etc/nginx/fragments/php;
}

这里需要注意的一点是——与“常规”位置块不同,基于正则表达式的匹配似乎按照配置文件中指定的顺序运行(而不是最长匹配优先,非正则表达式位置块似乎是这种情况)。因此,如果您正在执行特定于站点的 PHP 位置以及通用的“全站点”PHP 处理程序(location ~ \.php$),那么您需要将通用的“全站点”处理程序最后的在服务器块中,否则一切都会变得很糟糕。

是的,这很糟糕,如果我有动力的话,我可能会尝试找出嵌套情况到底出了什么问题(配置解析器没有对其进行处理,所以我怀疑它应该可以工作但实际上没有人使用它,所以它存在缺陷)。

答案3

据我所知,您不能使用嵌套块。

请尝试以下类似操作。

location / {
  root /var/www;
  access_log off;

  index index.php index.html;
  expires 1d;

  try_files $uri $uri/ /index.php?q=$uri;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_buffer_size 128k;
  fastcgi_buffers 4 256k;
  fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
  include        /usr/local/nginx/conf/fastcgi_params;
}

您可以将第二个块修改为类似

location ~ /foosite/.*php$

(需要测试)

相关内容