我正在滚动我自己的MVC框架,这让我发疯了。我有所有的url不解析到实际文件重定向到/index.php?$args
。在框架内,我查询REQUEST_URI以提取请求的上下文和参数。我从nginx wiki的"前端控制器模式"中偷了这个配置片段。
例子:
-
example.com/dashboard
-
example.com/user/456
-
example.com/devices
-
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;流浪汉"