如何正确使用 NginX location 指令?

如何正确使用 NginX location 指令?

我正在尝试使用在 Ubuntu 10.10 上通过 apt 安装的 phpmyadmin 包和 NginX,尽管我最终让它工作了,但我认为我做得不正确:

server {
  listen   80; ## listen for ipv4

  server_name  vpsnet.dev;

  error_log   /home/robin/dev/vpsnet/error.log;
  access_log  /var/log/nginx/vpsnet.access.log;

  location / {
    root   /home/robin/dev/vpsnet/webroot;
    index  index.php index.html;

    if (-f $request_filename) {
        break;
    }

    if (!-f $request_filename) {
        rewrite ^/(.+)$ /index.php?url=$1 last;
        break;
    }
  }

  location /phpmyadmin {
    root /usr/share;
    index index.php index.html;
  }

  location ~ ^/phpmyadmin/.*\.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /usr/share/$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SERVER_NAME $host;
  }

  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /home/robin/dev/vpsnet/webroot/$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SERVER_NAME $host;
  }
}

我讲的这个部分具体来说是这个部分:

  location /phpmyadmin {
    root /usr/share;
    index index.php index.html;
  }

  location ~ ^/phpmyadmin/.*\.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /usr/share/$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SERVER_NAME $host;
  }

如果我将root指令分别设置为/usr/share/phpmyadmin和设置fastcgi_param SCRIPT_FILENAME为,/usr/share/phpmyadmin/$fastcgi_script_name;我会得到 404。

我想象服务器正在将/phpmyadmin/URL 的一部分传递给 fastcgi 服务器,但我对此感到困惑,因为我使用过 Apache,而这种事情不是这样工作的。

我只是想知道是否有人可以解释一下这个问题,为什么会出现这种情况,以及我是否做错了什么。“完美”的设置会很棒,或者至少有一些关于如何更好地理解 NginX 配置的信息。

答案1

看看是否有效:

location /phpmyadmin {
  alias /usr/share/phpmyadmin;
  index index.php index.html;
}

location ~ .php$ {
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /usr/share/$fastcgi_script_name;
  include /etc/nginx/fastcgi_params;
  fastcgi_param SERVER_NAME $host;
}

你的配置不是错误的 或任何其他内容。不建议使用root内部location块,因为如果您获得大量位置块,它会开始变得混乱(因此最好每个服务器块都有一个根),但这不是您的情况,并且设置fastcgi通常以更广泛的方式完成(针对所有 php 请求)。

相关内容