NGINX 目录别名中的 PHP 不起作用

NGINX 目录别名中的 PHP 不起作用

我全新安装了 Ubuntu 14.04 服务器。我已经安装了 nginx、php 等...

server {
  listen 80;
  listen [::]:80;

  server_name testone.local;

  root /var/www/htmlone;
  index index.html;

  # pass the PHP scripts to FastCGI server listening on the php-fpm socket
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

  location /alias {
    alias  /var/www/htmlalias;
    location ~ \.php$ {
      try_files $uri =404;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
    }
  }
}

如果我在 中使用一个简单的 php 脚本,/var/www/htmlone php 会按预期执行。如果我在 中使用相同的脚本,它/var/www/htmlalias不会按预期执行。但如果我在 中放入 HTML 脚本,它会/var/www/htmlalias按预期显示,因此别名充当别名,但不执行 php 文件,但 php 在主根目录中工作。

我发现许多 serverfault 问题都说这个常规设置应该可以工作,但实际上却不行。有人发现我可能做错了什么吗?我在错误日志中没有看到任何消息。

我应该补充一下,这是针对 nginx 版本的:nginx/1.8.0

答案1

你遇到的问题实际上是三年前提交的长期存在的错误这导致aliastry_files无法真正一起工作。

在错误页面上有一个Luke Howell 的解决方法,具体如下:

location /api { ## URL string to use for api ##
    alias /home/api/site_files/; ## Site root for api code ##

    ## Check for file existing and if there, stop ##
    if (-f $request_filename) {
        break;
    }

    ## Check for file existing and if there, stop ##
    if (-d $request_filename) {
        break;
    }

    ## If we get here then there is no file or directory matching request_filename ##
    rewrite (.*) /api/index.php?$query_string;

    ## Normal php block for processing ##
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

但请注意,就 nginx 而言,如果是邪恶的应尽可能避免

答案2

从我对上述配置的测试来看,存在

try_files $uri =404;

在导致问题的嵌套别名 php 位置内。有了它,nginx 会检查“/var/www/htmlalias/alias/index.php”(请注意添加了“别名”和 uri),发现它不存在,然后返回 404。删除 try_files 会首先停止在磁盘上查找此文件,并将请求直接传递给 fastcgi,然后 fastcgi 会从 SCRIPT_FILENAME 中找到正确的文件。

如果您希望不存在的 PHP 文件出现 404 而不是 PHP 错误,则可执行以下操作:

  location /alias {
    alias  /var/www/htmlalias;
    location ~ /([^/]+\.php)$ {
      try_files /$1 =404;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
  }

首先,正则表达式捕获 php 文件的填充文件名(例如 foo.php)作为 $1。然后,try_files 相对于当前别名检查该文件是否存在,如果不存在则返回 404。

然后,我们必须通过在包含之后重新定义它来覆盖 fastcgi_params 中定义的默认 SCRIPT_FILENAME,因为 $request_filename 出于某种我无法理解的原因,完全是错误的东西(字面意思是 /index.php)。

答案3

这是我解决问题的方法:

在您的示例中,默认服务器配置(无别名):

server {
  listen 80;
  listen [::]:80;

  server_name testone.local;

  root /var/www/htmlone;
  index index.html;

  # pass the PHP scripts to FastCGI server listening on the php-fpm socket
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

并从命令行在下方创建一个符号链接/var/www/htmlone

ln -s /var/www/htmlalias /var/www/htmlone/alias

相关内容