nginx不发送请求到php-fpm如果URI包含"dashboard"但对于所有其他uri都是如此


nginx is not sending requests to php-fpm if URI contains "dashboard" but it does for all other URIs

我正在滚动我自己的MVC框架,这让我发疯了。我有所有的url不解析到实际文件重定向到/index.php?$args。在框架内,我查询REQUEST_URI以提取请求的上下文和参数。我从nginx wiki的"前端控制器模式"中偷了这个配置片段。

例子:

  1. example.com/dashboard
  2. example.com/user/456
  3. example.com/devices
  4. example.com/blog/789

上面所有的都应该向php-fpm发送一个index.php的请求。我的问题是,#1没有,#2、#3和#4却像预期的那样工作。

在#1的情况下,nginx(我认为)不是发送到php-fpm,而是返回index.php的内容,我结束了一个保存文件对话框的文件称为"仪表板",在文件是我的index.php源代码。

下面是我相关的nginx配置:

location ~ '.php$ {
    try_files $uri =404;
    include php_conf;
}

location / {
    try_files $uri /index.php?$args;
}

我的php_conf是标准的东西:

# With php5-fpm:
fastcgi_pass    unix:/var/run/php5-fpm.sock;
fastcgi_index   index.php;
fastcgi_intercept_errors        on;
fastcgi_ignore_client_abort     off;
fastcgi_param   DB_HOST        [redacted];
fastcgi_param   DB_USER        [redacted];
fastcgi_param   DB_NAME        [redacted];
fastcgi_param   DB_PASS        [redacted];
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
include         fastcgi_params;

fastcgi_params是这样的

fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
fastcgi_param   CONTENT_TYPE            $content_type;
fastcgi_param   CONTENT_LENGTH          $content_length;
fastcgi_param   SCRIPT_FILENAME         $request_filename;
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $document_root;
fastcgi_param   SERVER_PROTOCOL         $server_protocol;
fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;
fastcgi_param   REMOTE_ADDR             $remote_addr;
fastcgi_param   REMOTE_PORT             $remote_port;
fastcgi_param   SERVER_ADDR             $server_addr;
fastcgi_param   SERVER_PORT             $server_port;
fastcgi_param   SERVER_NAME             $server_name;
fastcgi_param   HTTPS                   $https;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

谁知道为什么/devices URI工作,但/dashboard没有?

转换用户和SEO友好的url(如上述格式)到调用index.php的nginx最佳实践是什么?

我很确定文件系统上没有名为/dashboard的文件,它当然不包含我的index.php文件的内容。

还有一个有趣的现象:情况2、3、4导致access.log中的HTTP 200日志条目,但在情况1中,即使服务器发送了index.php的源内容,nginx的访问或错误日志中也没有任何内容。

我困惑

我从来没有找到根本原因,但我开始怀疑nginx在vagrant上不是100%可靠的。我重新构建了流浪服务器,上面的配置确实有效。

所以当有疑问时:"vagrant destroy;流浪汉"

相关文章: