# 2.5 环境变量配置 :::tip 概述 项目使用 `.env` 文件管理环境变量,支持开发、测试、生产等多环境切换。配置优先级:`.env` > `config/*.php` > 代码默认值。 ::: ## .env 文件结构 项目 `.env` 文件采用 INI 分组格式,每个分组对应一个 `config/*.php` 配置文件: ```ini ; ============================================================================= ; .env 环境变量配置文件 ; ============================================================================= ; 格式:INI 分组格式,[分组] 下的键值对通过 env() 函数读取 ; 优先级:.env > config/*.php > 代码默认值 ; ============================================================================= ; 全局开关(不属于任何分组) APP_DEBUG = true ; 调试模式(开发 true,生产 false) [APP] DEFAULT_TIMEZONE = Asia/Shanghai ; 默认时区 DEMO = false ; 演示模式(true=拦截所有写操作) SHOW_ERROR_MSG = true ; 显示错误详情(生产环境设为 false) [DATABASE] TYPE = mysql ; 数据库类型(mysql / pgsql / sqlsrv / oracle / sqlite) HOSTNAME = 127.0.0.1 ; 数据库服务器地址 DATABASE = rxthinkcmf.thinkphp8.elevue ; 数据库名 USERNAME = root ; 用户名 PASSWORD = root ; 密码 HOSTPORT = 3306 ; 端口 CHARSET = utf8mb4 ; 字符集(支持 emoji) DEBUG = true ; SQL 调试(显示执行的 SQL 语句) PREFIX = think_ ; 表前缀 [JWT] SECRET = rxthinkcmf_jwt_secret_key_2024 ; 签名密钥(生产环境务必修改) ACCESS_TTL = 7200 ; access_token 有效期(秒),默认 2 小时 REFRESH_TTL = 604800 ; refresh_token 有效期(秒),默认 7 天 ISSUER = rxthinkcmf ; 签发者标识 [FILE] UPLOAD_DIR = D:\xampp8.2\htdocs\RXThinkCMF_ThinkPhp8_EleVue\uploads ; 上传根目录(绝对路径) DOMAIN_URL = http://file.thinkphp8.elevue ; 文件访问域名 IMAGE_EXT = gif,jpg,jpeg,png,bmp,webp,svg ; 允许的图片后缀 FILE_EXT = gif,jpg,jpeg,png,bmp,webp,svg,doc,docx,xls,xlsx,ppt,pptx,pdf,zip,rar,txt,csv,mp3,mp4,sql,js,css ; 允许的文件后缀 MAX_SIZE = 10 ; 单文件最大大小(MB) [CACHE] DRIVER = file ; 缓存驱动(file=文件,redis=Redis) REDIS_HOST = 127.0.0.1 ; Redis 地址(driver=redis 时生效) REDIS_PORT = 6379 ; Redis 端口 REDIS_PASSWORD = ; Redis 密码(无密码留空) REDIS_DB = 0 ; Redis 数据库编号 REDIS_PREFIX = rx: ; 缓存键前缀 [CORS] ALLOW_ORIGIN = * ; 允许的来源(* = 所有) [API] CAMEL_SNAKE_CONVERT = true ; 驼峰/下划线自动转换 [CAPTCHA] CAPTCHA_BYPASS_CODE = ; 万能验证码(开发用,生产务必留空) CAPTCHA_LENGTH = 6 ; 验证码字符长度(4-6位) CAPTCHA_EXPIRE = 300 ; 验证码过期时间(秒) [LANG] default_lang = zh-cn ; 默认语言 ``` ## 配置项详解 ### 应用配置 `[APP]` | 变量 | 默认值 | 说明 | |------|--------|------| | `DEFAULT_TIMEZONE` | `Asia/Shanghai` | 默认时区 | | `DEMO` | `false` | 演示模式,开启后拦截所有写操作 | | `SHOW_ERROR_MSG` | `true` | 是否显示错误详情,生产环境设为 `false` | 全局变量(不属于任何分组): | 变量 | 默认值 | 说明 | |------|--------|------| | `APP_DEBUG` | `true` | 调试模式,生产环境设为 `false` | ### 数据库配置 `[DATABASE]` | 变量 | 默认值 | 说明 | |------|--------|------| | `TYPE` | `mysql` | 数据库类型:mysql / pgsql / sqlsrv / oracle / sqlite | | `HOSTNAME` | `127.0.0.1` | 数据库主机 | | `DATABASE` | - | 数据库名称(SQLite 为文件路径) | | `USERNAME` | `root` | 数据库用户名 | | `PASSWORD` | - | 数据库密码 | | `HOSTPORT` | `3306` | 数据库端口 | | `CHARSET` | `utf8mb4` | 字符集 | | `DEBUG` | `true` | 是否开启 SQL 调试 | | `PREFIX` | `think_` | 表前缀 | ### JWT 配置 `[JWT]` | 变量 | 默认值 | 说明 | |------|--------|------| | `SECRET` | 内置默认值 | 签名密钥,**生产环境务必修改** | | `ACCESS_TTL` | `7200` | access_token 有效期(秒),默认 2 小时 | | `REFRESH_TTL` | `604800` | refresh_token 有效期(秒),默认 7 天 | | `ISSUER` | `rxthinkcmf` | 签发者标识 | ### 文件上传配置 `[FILE]` | 变量 | 默认值 | 说明 | |------|--------|------| | `UPLOAD_DIR` | - | 上传根目录(绝对路径) | | `DOMAIN_URL` | - | 文件访问域名 | | `IMAGE_EXT` | `gif,jpg,jpeg,png,bmp,webp,svg` | 允许的图片后缀 | | `FILE_EXT` | 多种后缀 | 允许的文件后缀 | | `MAX_SIZE` | `10` | 单文件最大大小(MB) | ### 缓存配置 `[CACHE]` | 变量 | 默认值 | 说明 | |------|--------|------| | `DRIVER` | `file` | 缓存驱动:`file` 或 `redis` | | `REDIS_HOST` | `127.0.0.1` | Redis 主机(driver=redis 时生效) | | `REDIS_PORT` | `6379` | Redis 端口(driver=redis 时生效) | | `REDIS_PASSWORD` | - | Redis 密码 | | `REDIS_DB` | `0` | Redis 数据库编号 | | `REDIS_PREFIX` | `rx:` | 缓存键前缀 | ### CORS 配置 `[CORS]` | 变量 | 默认值 | 说明 | |------|--------|------| | `ALLOW_ORIGIN` | `*` | 允许的来源,`*` 表示所有 | ### API 配置 `[API]` | 变量 | 默认值 | 说明 | |------|--------|------| | `CAMEL_SNAKE_CONVERT` | `true` | 驼峰/下划线自动转换开关 | ### 验证码配置 `[CAPTCHA]` | 变量 | 默认值 | 说明 | |------|--------|------| | `CAPTCHA_BYPASS_CODE` | (空) | 万能验证码,跳过验证。仅用于开发调试,**生产环境务必留空** | | `CAPTCHA_LENGTH` | `6` | 验证码字符长度(4-6位) | | `CAPTCHA_EXPIRE` | `300` | 验证码过期时间(秒),默认 5 分钟 | | `CAPTCHA_RATE_WINDOW` | `60` | 防刷窗口期(秒) | | `CAPTCHA_RATE_LIMIT` | `20` | 窗口期内最大获取次数 | | `CAPTCHA_CHARS` | `ABCDEFGHJKLMNPQRSTUVWXYZ2346789` | 字符集(已排除 0O、1lI 等易混淆字符) | | `CAPTCHA_FONT_PATH` | `static/fonts/Vera.ttf` | 字体路径 | | `CAPTCHA_IMAGE_WIDTH` | `160` | 图片宽度(像素) | | `CAPTCHA_IMAGE_HEIGHT` | `50` | 图片高度(像素) | | `CAPTCHA_FONT_SIZE` | `28` | 字体大小 | | `CAPTCHA_NOISE_LINES` | `8` | 干扰线数量 | | `CAPTCHA_NOISE_DOTS` | `500` | 噪点数量 | ### 国际化配置 `[LANG]` | 变量 | 默认值 | 说明 | |------|--------|------| | `default_lang` | `zh-cn` | 默认语言 | ### 代码生成器配置 `[GENERATOR]` | 变量 | 默认值 | 说明 | |------|--------|------| | `PARENT_MENU_ID` | `189` | 生成模块的父菜单ID | | `APP_NAME` | `tool` | 模块应用名(影响路由前缀和前端目录) | ## 多环境配置 ### 开发环境 ```ini ; 开发环境配置(调试开启,使用文件缓存) APP_DEBUG = true ; 开启调试模式 [APP] SHOW_ERROR_MSG = true ; 显示错误详情 [DATABASE] DEBUG = true ; 显示执行的 SQL [CACHE] DRIVER = file ; 使用文件缓存(无需 Redis) ``` ### 生产环境 ```ini ; 生产环境配置(调试关闭,使用 Redis 缓存) APP_DEBUG = false ; 关闭调试模式 [APP] SHOW_ERROR_MSG = false ; 不显示错误详情(防止泄露) [DATABASE] DEBUG = false ; 不显示 SQL [CACHE] DRIVER = redis ; 使用 Redis 缓存 REDIS_HOST = 127.0.0.1 ; Redis 地址 REDIS_PORT = 6379 ; Redis 端口 REDIS_PASSWORD = <你的Redis密码> ; Redis 密码 [JWT] SECRET = <随机生成的强密钥> ; 签名密钥(必须修改) [CORS] ALLOW_ORIGIN = https://admin.example.com ; 限制为实际域名 ``` ### 生成强密钥 ```bash # Linux / macOS:使用 OpenSSL 生成 32 字节随机 Base64 字符串 openssl rand -base64 32 # PHP:生成 32 字节随机十六进制字符串(64 个字符) # random_bytes(32) → 32 字节密码学安全随机数 # bin2hex() → 转为十六进制字符串 php -r "echo bin2hex(random_bytes(32));" ``` ## 前端环境变量 前端使用 Vite 的环境变量机制,配置文件位于 `ui/` 目录: ### `.env.development`(开发环境) ```bash # API 接口基础路径(Vite 代理会将此路径的请求转发到后端) VITE_GLOB_API_URL=/api # API 前缀(一般留空) VITE_GLOB_API_URL_PREFIX= # 是否启用 Mock 数据(false = 使用真实后端 API) VITE_USE_MOCK=false ``` ### `.env.production`(生产环境) ```bash # API 接口基础路径(生产环境的实际后端地址) VITE_GLOB_API_URL=/api # API 前缀 VITE_GLOB_API_URL_PREFIX= ``` 在代码中访问环境变量: ```typescript // 通过 import.meta.env 访问 Vite 环境变量 // VITE_ 前缀的变量才会被暴露给客户端代码 const apiUrl = import.meta.env.VITE_GLOB_API_URL ```