我正在使用Nginx和Codeigniter以及php5-fpm。一切“似乎”工作得很好,页面显示,一切看起来都很棒。 Ofcource这不是我在这里提出这个问题的原因,我实际上有一个问题。
我面临的问题是,页面会抛出404错误,即使页面呈现正确,我仍然会获得404(在日志中)。
我得到404的原因(在查看Nginx的错误日志之后)是因为Nginx无法打开我正在请求的文件,因为Nginx尝试直接打开PHP文件,而不是引用{ {1}}不幸的是Codeigniter以这种方式工作。
例如:
请求controller/method
在Nginx日志中生成404,其背后的原因是http://website.com/<controller>/<function>/<other_params>
无法打开指定的目录,因为它不存在,而不是引用open()
。 / p>
一些重要的日志:
Nginx错误日志:
controller/method
正如我之前所说,Nginx正试图直接访问该文件,而不是让Codeigniter处理它。
我的[error] 4172#0: *482 open() "/var/www/<domain>/public/site/section/main" failed
(2: No such file or directory), client: <client_ip>, server: <domain>, request: "GET
/site/section/main HTTP/1.1", host: "<domain>"
配置:
sites-enabled/ci
那么,Nginx和Codeigniter之间误解的原因是什么? 提前致谢。
答案 0 :(得分:2)
似乎你的配置中没有规则告诉nginx在找不到文件时尝试向php发送请求。有try_files
和@codeigniter
的评论区几乎看起来像。理论上这就是你想要的nginx:
为此,这两个块应该足够了:
location / {
# Check if a file exists, or route it to index.php.
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
# for security, see http://forum.nginx.org/read.php?2,88845,page=3
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
另一个if
防护区块不应该破坏这些区域。