
本文介绍一种安全、可靠的方式,使用 php 读取纯 js 文件(如 config.js)中定义的全局变量,并将其转换为关联数组,支持通过 url 参数(如 ?id=item1)动态返回对应数值。不依赖外部库,兼容 php 7.4+,强调安全性与实用性。
在实际开发中,有时需复用前端已有的 JavaScript 配置文件(如 config.js),避免重复维护多份配置。但 PHP 无法直接执行 JS 代码,也不能像 parse_ini_file() 那样原生解析 .js 格式。因此,关键在于“安全地提取变量赋值语句”,而非执行 JS。
✅ 推荐方案:正则解析 + 白名单校验
假设你的 config.js 内容如下(注意:仅支持简单 var name = value; 形式,不含函数、对象或注释):
var item1 = 1.00; var item2 = 25.00; var item3 = 35.00;
PHP 解析脚本 file.php 可这样实现:
<?php
// file.php —— 安全读取并响应 JS 变量值
$configFile = 'config.js';
// 1. 检查文件是否存在且可读
if (!is_readable($configFile)) {
http_response_code(404);
die('Config file not found or inaccessible.');
}
// 2. 读取原始内容
$content = file_get_contents($configFile);
// 3. 使用正则匹配 var 声明(支持整数、浮点、带引号字符串)
// 注意:不支持嵌套结构、注释、let/const,确保输入可控!
$pattern = '/^\s*var\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*([^;]+);/m';
$variables = [];
if (preg_match_all($pattern, $content, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$key = trim($match[1]);
$rawValue = trim($match[2]);
// 安全剥离引号(支持 "1.00" 或 '25.00'),并尝试转为数字或字符串
$value = trim($rawValue, " \t\n\r\0\x0B\"'");
// 若是纯数字(含小数点),转为 float/int;否则保留字符串
if (is_numeric($value)) {
$value = $value + 0; // 自动类型转换
}
$variables[$key] = $value;
}
}
// 4. 处理 GET 请求:?id=item1
if (isset($_GET['id']) && !empty($_GET['id'])) {
$requestedKey = (string)$_GET['id'];
// 强制白名单校验(强烈建议!防止任意键访问)
// 若允许所有键,请替换为:if (array_key_exists($requestedKey, $variables))
$allowedKeys = ['item1', 'item2', 'item3']; // ✅ 显式声明合法键名
if (in_array($requestedKey, $allowedKeys) && array_key_exists($requestedKey, $variables)) {
header('Content-Type: text/plain; charset=utf-8');
echo $variables[$requestedKey];
exit;
} else {
http_response_code(400);
die('Invalid or undefined variable name.');
}
}
// (可选)调试:输出全部变量(上线前请注释或移除)
// print_r($variables);
?>⚠️ 重要注意事项
- 绝不直接 eval() 或 include() JS 文件:存在严重远程代码执行(RCE)风险。
- JS 文件必须受信且格式受限:该方案仅适用于静态、人工维护的简单变量列表。若含 var obj = {a: 1}, const x = Math.PI 等复杂语法,需改用 JSON 格式或专用解析器(如 voku/jsl)。
- 务必启用白名单校验:仅允许预定义的键名被查询,防止通过 ?id=../../etc/passwd 等路径遍历或注入攻击。
-
生产环境建议迁移至 JSON:更安全、标准、易解析。例如将 config.js 改为 config.json:
{"item1": 1.00, "item2": 25.00, "item3": 35.00}对应 PHP 一行即可加载:
立即学习“PHP免费学习笔记(深入)”;
$config = json_decode(file_get_contents('config.json'), true) ?: [];
✅ 最终效果
访问 xyz.com/file.php?id=item2 将返回纯文本 25(PHP 自动转为整数)或 25.0(浮点),无 HTML 包裹,便于 AJAX 或跨域调用。
通过此方法,你既复用了现有 JS 配置,又保持了 PHP 后端的安全性与可控性——这才是前后端配置协同的务实之道。











