import{_ as i,o as a,c as t,a2 as n}from"./chunks/framework.B-QBKwc1.js";const o=JSON.parse('{"title":"环境变量配置","description":"项目使用 .env 文件管理环境变量,支持开发、测试、生产等多环境切换。","frontmatter":{},"headers":[],"relativePath":"zh/quickstart/env-vars.md","filePath":"zh/quickstart/env-vars.md"}'),h={name:"zh/quickstart/env-vars.md"};function l(e,s,d,p,k,r){return a(),t("div",null,[...s[0]||(s[0]=[n(`

2.6 环境变量配置 ​

概述

项目使用 .env 文件管理环境变量,支持开发、测试、生产等多环境切换。配置优先级:真实环境变量 > .env > config/*.php 中的默认值。模板文件为 .env.example,首次部署复制为 .env 后修改。

.env 文件结构 ​

项目 .env 采用 Laravel 标准的 KEY=VALUE 扁平格式(无分组),每个键按前缀对应一个 config/*.php 配置文件,通过 env() 函数读取:

ini
# =============================================================================
# .env 环境变量配置文件(Laravel 标准格式)
# =============================================================================
# 格式:KEY=VALUE 扁平结构,按前缀映射到 config/*.php(如 JWT_* → config/jwt.php)
# 优先级:真实环境变量 > .env > config/*.php 默认值
# 修改后执行 php artisan config:clear 清除配置缓存
# =============================================================================

# ─── 应用基础 ─────────────────────────────────────────────
APP_NAME=Laravel                       # 应用名称
APP_ENV=local                          # 环境标识(local / production)
APP_KEY=                               # 应用加密密钥(php artisan key:generate 生成)
APP_DEBUG=true                         # 调试模式(开发 true,生产必须 false)
APP_URL=http://localhost               # 应用访问地址
APP_TIMEZONE=Asia/Shanghai             # 应用时区(写入时间字段用,需与 MySQL、PHP 一致)
APP_LOCALE=en                          # 默认语言
BCRYPT_ROUNDS=12                       # bcrypt 成本因子(与 PasswordService 一致)

# ─── 日志 ─────────────────────────────────────────────────
LOG_CHANNEL=stack                      # 日志通道
LOG_LEVEL=debug                        # 日志级别(生产改为 info)

# ─── 数据库 ───────────────────────────────────────────────
DB_CONNECTION=mysql                     # 数据库类型(mysql / pgsql / sqlsrv / sqlite)
DB_HOST=127.0.0.1                      # 数据库地址
DB_PORT=3306                           # 端口
DB_DATABASE=rxthinkcmf.laravel13.elevue # 数据库名
DB_USERNAME=root                       # 用户名
DB_PASSWORD=root                       # 密码
DB_PREFIX=laravel_                     # 表前缀(脚本使用 laravel_ 前缀,必须保留)

# ─── 会话 / 缓存 / 队列(统一走 Redis,必需)──────────────
SESSION_DRIVER=redis                   # 会话驱动
SESSION_LIFETIME=120                   # 会话有效期(分钟)
QUEUE_CONNECTION=redis                 # 队列驱动
CACHE_STORE=redis                      # 缓存驱动

# ─── Redis ────────────────────────────────────────────────
REDIS_CLIENT=phpredis                  # 客户端(phpredis 扩展)
REDIS_HOST=127.0.0.1                   # Redis 地址
REDIS_PASSWORD=null                    # Redis 密码(设置了 requirepass 时必须同步)
REDIS_PORT=6379                        # Redis 端口

# ─── JWT ──────────────────────────────────────────────────
JWT_SECRET=                            # 签名密钥(必须 >= 32 字符,启动 fail-close 校验)
JWT_ACCESS_TTL=7200                    # access_token 有效期(秒),默认 2 小时
JWT_REFRESH_TTL=604800                 # refresh_token 有效期(秒),默认 7 天
JWT_PERMS_TTL=7200                     # 权限缓存 TTL(秒),建议不小于 refresh_ttl
JWT_ISSUER=rxthinkcmf                  # 签发者标识

# ─── 文件上传 ─────────────────────────────────────────────
FILE_UPLOAD_DIR=uploads                # 上传根目录(相对 public/)
FILE_DOMAIN_URL=                       # 文件访问域名(空则返回相对路径)
FILE_MAX_SIZE=10                       # 单文件大小上限(MB)
FILE_IMAGE_EXT=gif,jpg,jpeg,png,bmp,webp          # 允许的图片后缀(svg 已移除:XSS 风险)
FILE_EXT=gif,jpg,jpeg,png,bmp,webp,doc,docx,xls,xlsx,ppt,pptx,pdf,zip,rar,txt,csv  # 允许的文件后缀

# ─── CORS 跨域 ────────────────────────────────────────────
CORS_ALLOW_ORIGIN=*                    # 允许来源(逗号分隔;开发 *,生产改为具体域名)

# ─── API ──────────────────────────────────────────────────
API_CAMEL_SNAKE_CONVERT=true           # 请求/响应键名驼峰与下划线自动转换

# ─── 多租户 ───────────────────────────────────────────────
DEFAULT_TENANT_ID=1                    # 平台用户新增数据时的默认租户 ID

# ─── 演示模式 ─────────────────────────────────────────────
DEMO_MODE=false                        # true=拦截写操作(POST/PUT/DELETE/PATCH),#[DemoAllow] 例外

# ─── 受信代理 ─────────────────────────────────────────────
TRUSTED_PROXIES=                       # 逗号分隔的代理 IP 或 CIDR(CDN/负载均衡场景)

# ─── 验证码 ───────────────────────────────────────────────
CAPTCHA_LENGTH=6                       # 字符长度
CAPTCHA_CHARS=ABCDEFGHJKLMNPQRSTUVWXYZ2346789  # 字符集(已排除 0O、1lI 易混淆字符)
CAPTCHA_EXPIRE=300                     # 有效期(秒)
CAPTCHA_RATE_WINDOW=60                 # 防刷窗口期(秒)
CAPTCHA_RATE_LIMIT=10                  # 窗口期内最大获取次数
CAPTCHA_BYPASS_CODE=                   # 万能验证码(仅 APP_DEBUG=true 生效,生产务必留空)

# ─── 代码生成器 ───────────────────────────────────────────
GENERATOR_PARENT_MENU_ID=189           # 生成模块的父菜单 ID
GENERATOR_APP_NAME=tool                # 应用名(路由前缀、前端目录)

重要键说明

  1. JWT_SECRET 为空或不足 32 字符时,应用拒绝启动(fail-close)。生成:openssl rand -base64 32。
  2. DB_PREFIX=laravel_ 必须保留,漏配会报表不存在。
  3. REDIS_PASSWORD 与 Redis 实际密码必须一致,否则验证码、登录全部失败。
  4. APP_DEBUG 生产环境必须为 false(否则异常堆栈泄露给前端)。

配置文件映射 ​

.env 键前缀配置文件说明
APP_*config/app.php应用名称 / 环境 / 调试 / 密钥
DB_*config/database.php数据库连接 + Redis 连接
SESSION_*config/session.php会话
CACHE_* / QUEUE_*config/cache.php / config/queue.php缓存 / 队列
JWT_*config/jwt.php ★JWT 密钥与有效期
FILE_*config/file.php ★文件上传
CORS_ALLOW_ORIGINconfig/cors.php ★跨域
API_*config/api.php ★驼峰转换开关
CAPTCHA_*config/captcha.php ★验证码
DEFAULT_TENANT_IDconfig/tenant.php ★多租户
GENERATOR_*config/generator.php代码生成器
TRUSTED_PROXIESconfig/app.php受信代理
LOG_*config/logging.php日志
MAIL_*config/mail.php邮件

标 ★ 为本项目独立维护的配置文件(见 1.3 目录结构)。

配置项详解 ​

应用配置 ​

变量默认值说明
APP_NAMELaravel应用名称
APP_ENVlocal环境标识
APP_KEY(空)应用加密密钥,key:generate 生成
APP_DEBUGtrue调试模式,生产必须 false
APP_URLhttp://localhost应用访问地址
APP_TIMEZONEAsia/Shanghai应用时区,create_time / update_time 等时间字段按此写入,需与 MySQL、PHP 时区一致
BCRYPT_ROUNDS12密码哈希成本因子
DEMO_MODEfalse演示模式,开启后拦截所有写操作
DEFAULT_TENANT_ID1平台用户新增数据的默认租户 ID
TRUSTED_PROXIES(空)受信代理 IP/CIDR,CDN 后取真实 IP 用

数据库配置 ​

变量默认值说明
DB_CONNECTIONsqlite数据库类型:mysql / pgsql / sqlsrv / sqlite
DB_HOST127.0.0.1数据库主机
DB_PORT3306数据库端口
DB_DATABASE-数据库名(SQLite 为文件路径)
DB_USERNAMEroot用户名
DB_PASSWORD-密码
DB_PREFIXlaravel_表前缀

JWT 配置 ​

变量默认值说明
JWT_SECRET(必填)签名密钥,>= 32 字符,否则拒绝启动
JWT_ACCESS_TTL7200access_token 有效期(秒),默认 2 小时
JWT_REFRESH_TTL604800refresh_token 有效期(秒),默认 7 天
JWT_PERMS_TTL7200权限缓存 TTL(秒)
JWT_ISSUERrxthinkcmf签发者标识

Redis / 缓存配置 ​

变量默认值说明
REDIS_CLIENTphpredis客户端(需 PHP redis 扩展)
REDIS_HOST127.0.0.1Redis 主机
REDIS_PASSWORDnullRedis 密码(无密码保持 null)
REDIS_PORT6379Redis 端口
SESSION_DRIVERredis会话驱动
CACHE_STOREredis缓存驱动
QUEUE_CONNECTIONredis队列驱动

WARNING

会话 / 缓存 / 队列驱动不要改回 database——数据库脚本不含 Laravel framework 表(sessions / cache / jobs),改回后登录与缓存会直接报表不存在。

文件上传配置 ​

变量默认值说明
FILE_UPLOAD_DIRuploads上传根目录(相对 public/)
FILE_DOMAIN_URL(空)文件访问域名前缀,空则返回相对路径
FILE_MAX_SIZE10单文件大小上限(MB)
FILE_IMAGE_EXTgif,jpg,...允许的图片后缀(svg 已移除:内嵌 JS 导致 XSS 风险)
FILE_EXT多种后缀允许的文件后缀

CORS / API 配置 ​

变量默认值说明
CORS_ALLOW_ORIGIN*允许来源,逗号分隔;凭证模式下会回显具体 Origin
API_CAMEL_SNAKE_CONVERTtrue请求/响应键名驼峰与下划线自动转换

验证码配置 ​

变量默认值说明
CAPTCHA_BYPASS_CODE(空)万能验证码,仅 APP_DEBUG=true 时生效,生产务必留空
CAPTCHA_LENGTH6验证码字符长度(4-6 位)
CAPTCHA_EXPIRE300验证码过期时间(秒),默认 5 分钟
CAPTCHA_RATE_WINDOW60防刷窗口期(秒)
CAPTCHA_RATE_LIMIT10窗口期内最大获取次数
CAPTCHA_CHARSABCDEFGHJKLMNPQRSTUVWXYZ2346789字符集(已排除 0O、1lI 等易混淆字符)
CAPTCHA_FONT_PATHstatic/fonts/Vera.ttf字体路径
CAPTCHA_IMAGE_WIDTH160图片宽度(像素)
CAPTCHA_IMAGE_HEIGHT50图片高度(像素)
CAPTCHA_FONT_SIZE28字体大小
CAPTCHA_NOISE_LINES6干扰线数量
CAPTCHA_NOISE_DOTS300噪点数量

代码生成器配置 ​

变量默认值说明
GENERATOR_PARENT_MENU_ID189生成模块挂载的父菜单 ID
GENERATOR_APP_NAMEtool模块应用名(影响路由前缀和前端目录)

多环境配置 ​

开发环境 ​

ini
APP_ENV=local
APP_DEBUG=true                         # 开启调试模式(异常返回真实消息)

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=rxthinkcmf.laravel13.elevue
DB_PREFIX=laravel_

CORS_ALLOW_ORIGIN=*                    # 允许所有来源(Vite 代理/直连均可用)

CAPTCHA_BYPASS_CODE=                   # 可设置万能验证码(仅 debug 下生效)

生产环境 ​

ini
APP_ENV=production
APP_DEBUG=false                        # 关闭调试模式(防止堆栈泄露)

DB_PASSWORD=<强密码>

JWT_SECRET=<openssl rand -base64 32 生成的随机值>   # 必须修改

CORS_ALLOW_ORIGIN=https://admin.example.com        # 限制为实际域名

CAPTCHA_BYPASS_CODE=                   # 必须留空
DEMO_MODE=false                        # 按需开启演示模式
TRUSTED_PROXIES=                       # 部署在 CDN/负载均衡后时配置

生成强密钥 ​

bash
# Linux / macOS / Windows(Git Bash):OpenSSL 生成 32 字节随机 Base64 字符串
openssl rand -base64 32

# PHP:生成 32 字节随机十六进制字符串(64 个字符)
# random_bytes(32) → 32 字节密码学安全随机数
# bin2hex() → 转为十六进制字符串
php -r "echo bin2hex(random_bytes(32));"

配置缓存管理 ​

bash
php artisan config:clear               # 清除配置缓存(修改 .env 后执行)
php artisan config:cache                # 缓存配置(生产环境提升性能)
php artisan config:show jwt.secret      # 查看解析后的配置值(调试用,自动脱敏)

WARNING

生产执行 config:cache 后,.env 的修改不再生效,需重新 config:cache。Docker 部署通过容器环境变量注入配置(优先级高于 .env),见 2.8 Docker 快速体验。

前端环境变量 ​

前端使用 Vite 的环境变量机制,配置文件位于前端仓库目录:

.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

详细说明见 2.4 前端服务启动。

`,46)])])}const F=i(h,[["render",l]]);export{o as __pageData,F as default};