欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Nginx泛解析到子目录后自动判断有无public目录详解

程序员文章站 2022-08-27 09:57:45
前言 我们大家在配置本地 php 开发环境时,除非是在 windows 下,否则我都是偏向于 nginx + php-fpm, 即使 mac 下已经有了自带的 apach...

前言

我们大家在配置本地 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 {
 listen 80;
 server_name ~^(?<subdomain>.+).app$;
 set $root /users/kairee/sites/$subdomain;
 
 if ( -d "/users/kairee/sites/$subdomain/public") {
  set $root /users/kairee/sites/$subdomain/public;
 }
 root $root;
 charset utf-8;
 client_max_body_size 128m;
 index index.php;
 
 location / {
  try_files $uri $uri/ /index.php$is_args$args;
 }
 
 access_log off;
 
 location ~ \.php\?? {
  fastcgi_split_path_info ^(.+\.php)(/.+)$;
  fastcgi_pass unix:/tmp/php.sock;
  fastcgi_index index.php;
  include fastcgi_params;
  fastcgi_param script_filename $document_root$fastcgi_script_name;
 }
 
 location ~ /\.ht {
  deny all;
 }
}

采用这个配置以后:

  • 如果存在 ~/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 的话。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。