Nginx配置PHP

 多版本适配

以下配置仅接受访问指定后缀的静态资源,在这些后缀之外的文件访问会被重写到 index.php ,然后由 php 项目处理;

    # start 动态适配以 v 开头的版本号 ************************************************************************************************
    # 0.3> 项目静态资源  ---------------------
    # 匹配以 v<数字> 开头,指定后缀结尾的静态所有文件
    location ~ ^/(?<ver>v[1-9]\d*)/(?<file>.+\.(?:mp4|png|jpg|jpeg|gif|css|js|txt|ico|svg|eot|ttf|otf|woff|woff2|html))$ {
        # $ver变量是v1、v2等版本号,$file变量是版本号后的文件路径
        alias /var/www/html/chailv-$ver/public/$file;

        # 防目录穿越( 即,URL中出现 .. 时直接返回400,以防止匹配或执行到上层目录中的文件 )
        if ($file ~ "\.\.") { return 400; }

        # 静态资源请求不记录访问日志
        access_log off;
    }


    # 0.4> 匹配所有非静态资源 -------------------- 
    # 匹配以 v<数字> 开头的所有请求
    location ~ ^/(?<ver>v[1-9]\d*)(?<path>/.*)?$ {
        # $ver变量是v1、v2等版本号,$file变量是版本号后的文件路径
        # set $version_root /var/www/html/chailv-$ver/public;
        
        # 如果请求的文件或目录不存在,则重写 URL 至 index.php,并将请求路径作为参数名为 s 的值,类似 vue 的单页面应用;
        # 对于 Thinkphp 项目来说,所有接口请求都没有实际的磁盘文件,都要转到index.php来处理
        # 此处重写后,会访问重写后的地址(类似 return,当前 location 中,rewrite 后的配置项将不会被执行)
        
        # 当访问 v1/index/env 时,$request_filename 为 /var/www/html/chailv-v1/public/v1/index/env    
        # return 200 "输出要访问的文件路径: $request_filename";


        # 如下,当访问 /v1/index/env 时, 请求将被重写为 /index.php?s=/v1/index/env
        # rewrite ^/(.*)$ /index.php?s=$uri last;
        # 重写至 /v_index.php,之所以命名为 v_index.php,是为了避免与老版配置冲突,因为老版单项目默认会重写到 /index.php 
        rewrite ^/(.*)$ /v_index.php?s=$uri&$args last;
        # return 200 "输出重写后的请求地址: /index.php?s=$uri&$args";
    }


    # 0.5> PHP项目:匹配以 /v_index.php 开头的请求 --------------------------------
    location /v_index.php {


        # 从 $args 参数 (即 ?s=/v1/index/env) 中提取版本号和剩余路径
        # 正则匹配,并提取匹配到的字符串;提取后,$temp_ver变量是v1、v2等版本号,$real_path变量是版本号后的文件路径   
        # 示例:s=/v1/index/env -> $temp_ver = v1, $real_path = /index/env
        if ($args ~* "s=/(?<temp_ver>v[1-9]\d*)(?<real_path>/.*)?") {
            # 动态设置物理根目录
            set $version_root /var/www/html/chailv-$temp_ver/public;
            
            # 重写参数,去掉 v1 版本号
            # 结果:将 s=/v1/index/env 重写为 s=/index/env
            set $new_args "s=$real_path";
        }
        # return 200 "输出: $version_root,$new_args";
        
        # FastCGI配置
        root $version_root;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $version_root/index.php;
        include        fastcgi_params;
        fastcgi_param  QUERY_STRING  $new_args;
    }


单版本配置

# 0.3> 项目静态资源, URI以“/static”开头的请求全部以静态资源处理 ---------------------
    location /static {
        root /var/www/html/chailv/public;  
    }


    # 0.31> 其它静态资源,若URI不是以“/static”开头,但后缀是态资源的,则全部以静态资源处理
    # ~ 表示使用正则匹配
    # \ 表示正则开始,此处匹配所有指定后缀的文件
    location ~ \.(mp4|png|jpg|jpeg|gif|css|js|txt|ico|font|woff|woff2) {
        root /var/www/html/chailv/public;  
    }


    # 0.4> PHP项目
    location / {


        # Thinkphp6的伪静态配置
        if (!-e $request_filename){
            rewrite ^/(.*)$ /index.php?s=/$1 last;
        }


        # FastCGI配置
        root           /var/www/html/chailv/public;  
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
举报

© 著作权归作者所有


0