記一次nginx php配置的心路歷程

1.原本搞好了php的配置,想把目錄下移一層 從 www.abc.com 變成 www.abc.com/wxapi ,因爲個人真實文件目錄比路由少了一層public 嘗試了不少辦法都不行 甚至想到了upstream+proxy_pass 但因爲是內部轉發會致使獲取request url路徑出問題。php

例如個人路徑是 www.abc.com/wxapi 想獲取 /wxapi/public/index.php 用nginx各類正則也沒法匹配對。由於$fastcgi_script_name 這裏直接就是/wxapi/info.php,不能在中間硬插一個路徑html

在將近花費半天后 終於搞定 。終於搞清了fastcgi是如何匹配的
1.獲取變量$fastcgi_script_name
2.用正則匹配出不含子路徑/wxapi/的變量
3.拼接出真實的script_name地址。 #$real_script_name
4.這樣fastcgi就能夠解析最後的$doucument_root/$real_script_name 文件了
貼下代碼nginx

location /wxapi/ {
      alias /usr/local/www/wxapi/public/;
      index index.php index.html index.htm;
      try_files $uri $uri/ index.php$is_args$args;
   }
  #  location ~ \.php {
  #    echo 'fuck';
  #  }
    location ~ ^/wxapi/.*\.php {
        # 設置文件根路徑
        root /usr/local/www/wxapi/public/;
        include fastcgi_params;
        set $path_info "";
        set $real_script_name $fastcgi_script_name;
        ##正則匹配URI,若能匹配將產生兩個子組
        if ($fastcgi_script_name ~ "^(/wxapi/)(.+?\.php)(/.+)?$") {
            ##將兩個子組賦值給剛生成的兩個nginx變量
            set $real_script_name $2; #拼接出真實的script_name地址。 #$real_script_name
            set $path_info $3; #支持pathinfo參數
        }
        # echo "real_script_name----$real_script_name";
        # echo "path_info----$path_info";
        # echo "document_root----$document_root";
        fastcgi_index index.php;
        # 這裏必定要多一個/否則匹配會替換掉
        fastcgi_param SCRIPT_FILENAME $document_root/$real_script_name;
        fastcgi_param PATH_INFO       $path_info;
        fastcgi_pass unix:/usr/local/php-7.2.12/var/run/php-cgi.sock;
    }
相關文章
相關標籤/搜索