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;
}