我无法绕过Nginxs'try_files
。最近我在我的开发机器上安装了Nginx以支持Apache。我以前的工作方式是这样的:我在我的http目录的子文件夹中引导一个项目。如果这涉及laravel,wordpress,codeigniter或任何其他使用前端控制器使URL更具可读性的框架,我会在该目录中添加.htaccess来重写index.php的所有不存在的路径。
据说,这在Nginx上非常简单:try_files $uri $uri/ /index.php?$query_string
它应该可行。但是,所有这一切都将所有内容重定向到$document_root
中的index.php。例如:
文件结构:
http/clients/cms/public/index.php
前端控制器http/clients/cms/public/some/application/url
使用参数some
,application
和url
请求uri。 http/clients/cms/public/images/image.png
一个静态文件。http/clients/blog/index.php
另一个前端控制器http/clients/blog/wp-content/image.png
另一个静态文件http/clients/blog/some-article-title
一个“漂亮的网址”,应该定向到4
现在,请求2
,try_files检测到/ some,/ some / application和/ some / application / url不存在。它现在将重定向到/index.php。我希望它会重定向到public/
目录中的index.php,但事实并非如此。相反,它重定向到$ document_root中的index.php(恰好包含phpinfo();
调用,因此很容易看出它出错了。)。
解决方案是在我的Nginx配置中创建多个位置块,但我不喜欢它。它会为我的引导过程增加大量的额外工作。
有没有办法在目录中使用try_files,以便它的工作原理与apache替代?
我的配置文件:
server {
listen 80;
server_name localhost,imac.local;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
rewrite_log on;
root /Volumes/Storage/Fabian/Dropbox/Sites;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
#echo $request_filename;
#break;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#fastcgi_split_path_info ^(.+\.php)(.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
谢谢!