1. 程式人生 > 其它 >Nginx泛解析到子目錄,自動判斷有無public目錄

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 {
    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 的話。