Nginx泛解析到子目录后自动判断有无public目录详解
前言
我们大家在配置本地PHP开发环境时,除非是在Windows下,否则我都是偏向于Nginx+PHP-FPM,即使Mac下已经有了自带的Apache+PHP环境,依然如此。一方面是因为Mac自带的PHP版本不够新(5.6.x),另一方面,Nginx+PHP-FPM更接近于我的生产服务器环境,而且也方便用Homebrew来管理版本和扩展。
在Mac下开发Laravel,官方提供了valet,可以方便地把子目录映射为虚拟主机,但我在使用的时候,遇到一些问题:
- 真实错误信息难以追踪,总是报valet的index.php或者laravel的index.php错误;
- Symfony框架里的config.php/app_debug.php等无法直接访问。
于是我只保留了dnsmasq来管理特定后缀的域名(实现自动解析),然后放弃了valet,自己做了一个泛解析绑定到本地子目录的配置。
具体配置如下(域名是*.app):
server{ listen80; server_name~^(?.+).app$; set$root/Users/kairee/Sites/$subdomain; if(-d"/Users/kairee/Sites/$subdomain/public"){ set$root/Users/kairee/Sites/$subdomain/public; } root$root; charsetutf-8; client_max_body_size128M; indexindex.php; location/{ try_files$uri$uri//index.php$is_args$args; } access_logoff; location~\.php\??{ fastcgi_split_path_info^(.+\.php)(/.+)$; fastcgi_passunix:/tmp/php.sock; fastcgi_indexindex.php; includefastcgi_params; fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name; } location~/\.ht{ denyall; } }
采用这个配置以后:
- 如果存在~/Sites/domain/public,则domain.app域名的根目录会指向~/Sites/domain/public;
- 如果存在~/Sites/domain但是不存在~/Sites/domain/public,则domain.app域名的根目录会指向~/Sites/domain;
- 网站根目录下真实存在的php文件可以直接访问,只有不存在的文件才会通过入口文件(index.php)处理;
- 如果需要支持其它框架,可以在配置文件中加一条if语句实现,比如要支持symfony的话,复制一下if判断块,把public改成web即可。
我虽然只是用于mac/linux,但实际上Windows下当然也是可以的,如果你在Windows下也使用Nginx的话。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。