☰
CentOS部署Typecho完整指南:Nginx+PHP-FPM+MariaDB实战
2026/10/17 14:59:19 网站建设 项目流程

1. 项目概述:为什么在CentOS上装Typecho不是“点几下鼠标”的事

Typecho是个轻量、干净、专注写作的开源博客系统,用PHP+MySQL驱动,代码精简到只有几千行,但正因如此,它不像WordPress那样自带“一键安装向导”,也不像某些SaaS建站工具能自动搞定所有依赖。而CentOS——尤其是7.x和8.x这两个长期支撑企业级服务的版本——它的设计哲学是“稳定压倒一切”,默认不装PHP、不启MySQL、不放端口、不开SELinux宽松策略。所以当你搜“CentOS下Typecho的安装”,真正要解决的从来不是“把zip包解压到/var/www/html里就完事了”,而是:如何在一个以安全和保守为默认配置的操作系统上,亲手搭起一条从内核网络栈到PHP执行环境、再到数据库连接、最后到Web服务器响应的完整数据通路。

我做过不下20个基于CentOS的Typecho部署,覆盖物理服务器、云主机、Docker容器三种形态,最常被卡住的环节根本不是Typecho本身,而是三个“看不见的墙”:SELinux对文件上下文的严格限制、firewalld对80/443端口的默认拦截、以及PHP-FPM与Nginx之间socket权限错配导致的502 Bad Gateway。这些细节在官方文档里往往只有一行带过,但在真实机房或云环境中,它们就是你凌晨两点还在查日志的原因。这篇文章不讲“复制粘贴就能跑”,而是带你一节一节拆开CentOS这台老式机械钟表,看清每个齿轮怎么咬合——包括为什么必须用php-fpm而不是mod_php,为什么MySQL要禁用strict mode,以及Typecho安装时那个“无法写入config.inc.php”的报错,90%情况下其实跟Typecho无关,而是SELinux的httpd_sys_rw_content_t上下文没打上去。

适合谁看?如果你刚买了一台阿里云ECS(CentOS 7.9)、腾讯云CVM(CentOS 8.4),或者在公司IDC里领到一台裸金属服务器,想自己搭个技术博客、团队知识库,又不想用第三方托管服务;如果你已经试过网上三四个教程,结果卡在“页面空白”“500错误”“数据库连接失败”,却找不到日志在哪、该看哪一行;或者你是运维新人,正需要一份能放进交接文档里的、经得起反复验证的部署手册——那这篇就是为你写的。它不假设你懂SELinux策略语法,但会告诉你semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/typecho(/.*)?"这一行命令背后,是在给Apache/Nginx进程发放一张“允许读写博客目录”的数字通行证。

2. 整体架构设计与方案选型逻辑

2.1 为什么坚持用Nginx + PHP-FPM组合,而不是Apache + mod_php?

这是整个部署决策链的第一个支点。CentOS 7默认带的是Apache 2.4,8则默认切换到Nginx 1.14+,但很多老教程仍沿用Apache方案。我实测对比过两种组合在Typecho场景下的表现:

  • 内存占用:Apache prefork模式下,每个请求独占一个httpd进程,Typecho首页静态资源+PHP动态渲染平均消耗约35MB内存;而Nginx作为事件驱动型服务器,自身仅占2MB,PHP-FPM子进程按需启动(通常设为3~5个),单个php-fpm进程约12MB。在1G内存的入门云服务器上,前者极易触发OOM Killer杀掉MySQL,后者可稳定运行半年以上。

  • 文件权限控制粒度:Apache的mod_php以apache用户身份执行PHP脚本,意味着整个Web根目录都得对apache用户可写——这直接违反最小权限原则。而PHP-FPM可独立配置运行用户(如www-data或nginx),Nginx只负责转发请求,两者用户分离后,Typecho的install.php只需临时赋予config.inc.php写权限,安装完立刻回收,风险面大幅收窄。

  • SELinux兼容性:CentOS的SELinux策略对httpd_t(Apache)和nginx_t(Nginx)标签有不同预设规则。httpd_t默认允许访问httpd_sys_content_t标签的文件,但Typecho需要写入usr/uploads/、usr/plugins/等目录,必须手动添加httpd_sys_rw_content_t上下文;而nginx_t策略更“干净”,没有预设的读写标签,反而迫使你显式声明每个需要写入的路径,这种“强制显式授权”恰恰提升了安全性可审计性。

提示:不要试图用setsebool -P httpd_can_network_connect 1全局放开Apache网络连接——这等于给Web服务器发了一张通往内网所有服务的通用通行证。正确做法是只对PHP-FPM进程启用httpd_can_network_connect_db布尔值,精准放行数据库连接。

2.2 MySQL vs MariaDB:为什么推荐MariaDB 10.3+?

CentOS 7默认仓库提供MySQL 5.7,8则提供MySQL 8.0。但Typecho官方文档明确标注“兼容MySQL 5.6+”,实际测试中发现两个关键兼容性陷阱:

  • MySQL 8.0默认认证插件变更:caching_sha2_password插件导致PHP 7.2以下版本(CentOS 7默认PHP 7.2.24)无法建立连接,报错Client does not support authentication protocol requested by server。虽然可通过ALTER USER 'typecho'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';降级,但这属于绕过设计约束,且每次MySQL升级都可能重置。

  • 严格SQL模式(STRICT_TRANS_TABLES)冲突:Typecho部分SQL语句(如INSERT INTO table (col) VALUES ()空值插入)在严格模式下会直接报错。MySQL 5.7+默认启用该模式,而MariaDB 10.3+虽也支持,但其默认配置文件/etc/my.cnf.d/client.cnf中sql_mode为空,更易控制。

MariaDB是MySQL的完全兼容分支,CentOS官方仓库长期维护,且10.3版本已通过Typecho全功能测试(包括附件上传、评论审核、插件激活)。我们选择yum module install mariadb:103而非mysql:80,本质是选择“可控的兼容性”而非“前沿的功能”。

2.3 PHP版本抉择:7.4是当前CentOS生态的黄金平衡点

Typecho最低要求PHP 5.6,最高兼容PHP 8.2,但中间存在明显断层:

  • PHP 7.2及以下:缺少filter_var()对FILTER_VALIDATE_EMAIL的完整RFC 5322支持,导致Typecho后台邮箱验证偶发失败;且json_encode()在处理超长字符串时存在性能退化。

  • PHP 8.0+:引入JIT编译器,但Typecho核心未做适配,__get()魔术方法在属性不存在时返回null的行为被强化,某些未规范定义$this->xxx的插件会触发Error而非Notice,造成白屏。

PHP 7.4是最后一个非JIT、且全面修复了7.2/7.3时代bug的版本。CentOS 7通过epel-release和remi-php74仓库可稳定安装,8则直接内置。它对Typecho的var_export()序列化、mbstring多字节处理、opcache预加载均有最佳实践支持。我们不追求最新,只选最稳——就像汽车工程师不会在F1赛车上用最新款芯片,而是选用经过10万小时路测的成熟型号。

3. 核心环境准备与逐项验证

3.1 系统初始化:关闭干扰项,建立可信基线

在任何操作前,先执行标准化初始化。这不是“仪式感”,而是排除90%后续问题的必要步骤:

# 更新系统并重启(确保内核和基础库最新) sudo yum update -y && sudo reboot # 检查SELinux状态(必须为enforcing,disabled模式等于自废武功) sudo sestatus # 输出应为:SELinux status: enabled # Current mode: enforcing # Mode from config file: enforcing # 若为permissive,立即修正: sudo sed -i 's/SELINUX=permissive/SELINUX=enforcing/g' /etc/selinux/config sudo setenforce 1 # 关闭firewalld(生产环境请替换为精确端口放行,此处为调试简化) sudo systemctl stop firewalld sudo systemctl disable firewalld # 生产环境替代方案: # sudo firewall-cmd --permanent --add-service=http # sudo firewall-cmd --permanent --add-service=https # sudo firewall-cmd --reload

注意:很多人跳过sestatus检查,直接setenforce 0临时关闭SELinux,结果部署完成后一切正常,一重启服务器又500错误——因为/etc/selinux/config里还是enforcing,而临时关闭状态不会持久化。务必确认Current mode和Mode from config file一致。

3.2 Web服务器部署:Nginx配置的五个生死细节

Nginx安装本身很简单,但配置不当会导致Typecho永久性功能缺失。以下是/etc/nginx/conf.d/typecho.conf中必须包含的五处关键设置:

server { listen 80; server_name your-domain.com; # 替换为你的域名或IP root /var/www/html/typecho; index index.php; # 细节1:必须启用try_files,否则Typecho的永久链接(Permalink)失效 location / { try_files $uri $uri/ /index.php?$args; } # 细节2:PHP处理块,必须指定fastcgi_pass为unix socket路径 # (而非127.0.0.1:9000),避免TCP握手开销和端口冲突 location ~ \.php$ { fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 细节3:禁止直接访问敏感目录(Typecho无此防护,必须由Nginx补位) location ~ ^/(usr|var|config|install)\.php { deny all; } # 细节4:上传文件大小限制(Typecho默认2M,但图片附件常超限) client_max_body_size 16M; # 细节5:隐藏Nginx版本号,减少指纹暴露面 server_tokens off; }

验证是否生效:

# 检查语法 sudo nginx -t # 重新加载配置(不中断服务) sudo systemctl reload nginx # 查看监听端口 sudo ss -tlnp | grep :80 # 应输出:LISTEN 0 128 *:80 *:* users:(("nginx",pid=1234,fd=6),("nginx",pid=1235,fd=6))

实操心得:fastcgi_pass unix:/run/php-fpm/www.sock这个路径必须与PHP-FPM配置完全一致。CentOS 7中PHP-FPM默认socket路径是/var/run/php-fpm/www.sock,而8是/run/php-fpm/www.sock。若不匹配,Nginx error.log里会持续报connect() to unix:/run/php-fpm/www.sock failed (2: No such file or directory)。建议统一用sudo find /var/run /run -name "www.sock"定位真实路径。

3.3 PHP环境构建:七步完成安全加固

PHP安装需分步进行,每步都有其不可跳过的安全意义:

# 步骤1:启用EPEL和Remi仓库(CentOS 7) sudo yum install epel-release -y sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm -y # 步骤2:启用PHP 7.4模块 sudo yum-config-manager --enable remi-php74 # 步骤3:安装核心组件(不含危险扩展) sudo yum install php php-fpm php-mysqlnd php-gd php-mbstring php-xml php-json php-opcache -y # 步骤4:禁用高危PHP函数(编辑/etc/php.ini) sudo sed -i 's/;disable_functions =.*/disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source/' /etc/php.ini # 步骤5:调整PHP-FPM池配置(/etc/php-fpm.d/www.conf) # 修改用户组,避免root权限运行 user = nginx group = nginx # 设置进程管理为ondemand,节省内存 pm = ondemand pm.max_children = 5 pm.process_idle_timeout = 10s # 启用慢日志,便于排查卡顿 slowlog = /var/log/php-fpm/www-slow.log request_slowlog_timeout = 5s # 步骤6:创建PHP-FPM运行用户(若不存在) sudo useradd -r -s /sbin/nologin nginx # 步骤7:启动并设为开机自启 sudo systemctl start php-fpm sudo systemctl enable php-fpm

验证PHP是否正常工作:

# 创建测试页 echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/phpinfo.php # 访问 http://your-server-ip/phpinfo.php,应显示PHP信息页 # 检查关键项:Server API应为"FPM/FastCGI",Loaded Configuration File应为"/etc/php.ini"

注意:disable_functions列表中的curl_exec看似影响Typecho的远程插件更新,但Typecho更新机制实际走的是file_get_contents(),而非cURL。禁用cURL可阻断90%的WebShell外连行为,代价极小。

3.4 数据库部署:MariaDB的四道安全锁

MariaDB安装后,必须立即执行四层加固,否则Typecho安装界面输入的数据库密码等于公开广播:

# 启动MariaDB并设开机自启 sudo systemctl start mariadb sudo systemctl enable mariadb # 执行安全初始化(交互式,按提示操作) sudo mysql_secure_installation # 关键选项:Set root password? [Y/n] Y → 输入强密码 # Remove anonymous users? [Y/n] Y # Disallow root login remotely? [Y/n] Y # Remove test database and access to it? [Y/n] Y # Reload privilege tables now? [Y/n] Y # 创建Typecho专用数据库和用户(绝不使用root!) sudo mysql -u root -p <<'EOF' CREATE DATABASE typecho DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'typecho_user'@'localhost' IDENTIFIED BY 'StrongPassw0rd!'; GRANT ALL PRIVILEGES ON typecho.* TO 'typecho_user'@'localhost'; FLUSH PRIVILEGES; EOF # 验证用户权限 sudo mysql -u typecho_user -p'StrongPassw0rd!' -e "SHOW DATABASES;" | grep typecho # 应输出:typecho

实操心得:utf8mb4字符集是硬性要求。Typecho 1.2+全面支持Emoji和生僻汉字,而旧版utf8在MySQL中实际是utf8mb3,最大只支持3字节字符,遇到👨‍💻这类4字节Emoji会截断存储,导致前端JSON解析失败。COLLATE utf8mb4_unicode_ci则确保中文排序、搜索的准确性。

4. Typecho安装全流程与避坑指南

4.1 文件部署:解压、赋权、打标签的三步铁律

Typecho官方包是zip格式,但CentOS默认无unzip命令,且解压后权限混乱。必须按顺序执行:

# 进入Web根目录 cd /var/www/html # 下载最新稳定版(截至2023年,1.2.2是主流) sudo wget https://github.com/typecho/typecho/releases/download/v1.2.2/typecho.zip # 安装unzip并解压 sudo yum install unzip -y sudo unzip typecho.zip # 此时生成/typecho/目录,但属主是root,SELinux上下文是default_t # 第一步:修改属主(Nginx和PHP-FPM需能读取和写入) sudo chown -R nginx:nginx typecho/ # 第二步:递归设置目录权限(755读执行,644读写,符合Web安全基线) sudo find typecho/ -type d -exec chmod 755 {} \; sudo find typecho/ -type f -exec chmod 644 {} \; # 第三步:最关键——打SELinux上下文标签 # 允许Nginx读取所有文件 sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html/typecho(/.*)?" # 允许Nginx写入特定目录(安装、上传、插件、缓存) sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/typecho/usr(/.*)?" sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/typecho/install.php" sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/typecho/config.inc.php" # 应用新标签(-F强制递归,-v显示过程) sudo restorecon -R -v /var/www/html/typecho/

验证SELinux标签是否生效:

# 查看typecho目录标签 ls -Z /var/www/html/typecho/ # 应显示:unconfined_u:object_r:httpd_sys_content_t:s0 # 查看usr目录标签 ls -Z /var/www/html/typecho/usr/ # 应显示:unconfined_u:object_r:httpd_sys_rw_content_t:s0

提示:restorecon命令不是一次性的。当Typecho自动创建usr/uploads/子目录时,新目录默认继承父目录标签,但若手动mkdir,则需再次restorecon -v /var/www/html/typecho/usr/uploads/。建议将此命令加入Typecho的部署脚本末尾。

4.2 安装向导执行:从浏览器到数据库连接的完整链路

打开浏览器访问http://your-server-ip/typecho/install.php,安装向导会自动启动。此时需关注四个关键节点:

  • 第一步:环境检测
    若出现红色警告“PHP extension mbstring not loaded”,说明PHP安装时漏了php-mbstring;若提示“Cannot write to config file”,则是config.inc.php的SELinux标签未打或权限不足(chown nginx:nginx未执行)。切勿点击“忽略并继续”——这等于跳过地基检查就盖楼。

  • 第二步:数据库配置
    填写:

    • 数据库地址:localhost(绝不用127.0.0.1,避免IPv6解析延迟)
    • 数据库名:typecho
    • 用户名:typecho_user
    • 密码:StrongPassw0rd!(与之前创建的一致)
    • 前缀:typecho_(可自定义,但建议保持默认)

    注意:若报错“Connection refused”,先检查MariaDB是否运行:sudo systemctl status mariadb;若状态为active,再检查/var/log/mariadb/mariadb.log是否有Can't start server : Bind on unix socket类错误——这通常是/var/lib/mysql/目录权限被误改,需sudo chown -R mysql:mysql /var/lib/mysql/并重启。

  • 第三步:管理员账户
    设置用户名、密码、邮箱。密码强度要求:至少8位,含大小写字母+数字。邮箱必须真实可用,因为Typecho的密码找回、评论通知均依赖此邮箱,且首次登录后无法修改(需直接改数据库)。

  • 第四步:完成安装
    点击“确认安装”,页面跳转至成功提示,并显示config.inc.php已生成。此时必须立即删除install.php:

    sudo rm /var/www/html/typecho/install.php

    否则任何人均可重新执行安装,覆盖现有数据库。

4.3 首次登录与基础配置:三个必调参数

安装完成后,访问http://your-server-ip/typecho/进入前台,http://your-server-ip/typecho/admin/进入后台。首次登录后,立即进入“设置”→“基本设置”,调整以下三项:

  • 站点名称/描述:直接影响SEO标题和meta description,建议包含核心关键词(如“Linux运维笔记”)。

  • 文章摘要长度:Typecho默认摘要截取前200字符,但中文标点占2字节,易在标点中间截断。建议设为180或220,然后在主题index.php中用<?php $this->excerpt(180); ?>硬编码控制。

  • 评论设置:勾选“评论需审核”,关闭“游客评论”,启用“Akismet反垃圾评论”(需申请API Key)。Typecho的默认评论表结构无索引优化,开放游客评论后,垃圾评论爬虫可在1小时内灌入数千条无效数据,拖慢整个数据库。

实操心得:Typecho后台的“永久链接”设置,若选“自定义”并填/{year}/{month}/{day}/{title}.html,需确保Nginx的try_files指令已按3.2节配置,否则所有文章页返回404。这是新手最常踩的坑——以为是Typecho问题,实则是Web服务器路由未打通。

5. 常见故障排查与独家经验

5.1 502 Bad Gateway:PHP-FPM与Nginx的握手失败

这是CentOS部署Typecho的头号故障,症状是浏览器显示“502 Bad Gateway”,Nginx error.log中反复出现:

connect() to unix:/run/php-fpm/www.sock failed (111: Connection refused)

排查链路如下:

  1. 确认PHP-FPM进程是否存在

    sudo systemctl status php-fpm # 若为inactive,执行 sudo systemctl start php-fpm
  2. 检查socket文件是否存在且权限正确

    ls -l /run/php-fpm/www.sock # 正确权限应为:srw-rw----. 1 nginx nginx # 若属主不是nginx,执行:sudo chown nginx:nginx /run/php-fpm/www.sock
  3. 验证PHP-FPM配置中socket路径是否匹配

    sudo grep "listen =" /etc/php-fpm.d/www.conf # 输出应为:listen = /run/php-fpm/www.sock # 若为其他路径(如/var/run/php-fpm/www.sock),需同步修改Nginx配置
  4. 检查SELinux是否阻止Nginx访问socket

    sudo ausearch -m avc -ts recent | grep nginx # 若出现avc: denied { connectto } for ... scontext=system_u:system_r:httpd_t:s0 ... # 则需添加SELinux规则: sudo setsebool -P httpd_can_network_connect 1

独家技巧:在/etc/php-fpm.d/www.conf中添加listen.owner = nginx和listen.group = nginx,可确保socket文件创建时即拥有正确属主,避免每次重启PHP-FPM后手动chown。

5.2 数据库连接失败:MySQL严格模式的隐性杀手

Typecho安装时提示“数据库连接失败”,但MariaDB服务正常、用户名密码无误。此时应检查MySQL严格模式:

sudo mysql -u typecho_user -p'StrongPassw0rd!' -e "SELECT @@sql_mode;" # 若输出包含 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES,则需禁用 sudo mysql -u root -p -e "SET GLOBAL sql_mode='';" # 永久生效:编辑 /etc/my.cnf,在[mysqld]段添加 # sql_mode = "" sudo systemctl restart mariadb

注意:SET GLOBAL只对当前会话有效,重启MariaDB后恢复默认。必须修改配置文件才能持久化。Typecho的Db::factory()方法在执行CREATE TABLE时,若字段定义为NOT NULL但无默认值,严格模式会直接拒绝建表。

5.3 附件上传失败:PHP与Nginx的双重限制

前台上传图片时提示“上传失败”,检查/var/log/php-fpm/www-error.log发现:

PHP Warning: POST Content-Length of 12345678 bytes exceeds the limit

这是PHP和Nginx双层限制叠加的结果:

  • PHP层:/etc/php.ini中upload_max_filesize = 2M和post_max_size = 8M
  • Nginx层:client_max_body_size 16M(已在3.2节配置)

解决方案:

# 修改PHP限制(注意post_max_size必须 >= upload_max_filesize) sudo sed -i 's/upload_max_filesize = .*/upload_max_filesize = 16M/' /etc/php.ini sudo sed -i 's/post_max_size = .*/post_max_size = 16M/' /etc/php.ini sudo systemctl restart php-fpm # 确认Nginx配置已包含 client_max_body_size 16M(见3.2节) sudo nginx -t && sudo systemctl reload nginx

5.4 后台白屏:PHP错误被静默吞掉

访问/admin/页面一片空白,查看Nginx access.log有200状态码,但error.log无报错。这是PHP错误报告被关闭所致:

# 编辑 /etc/php.ini sudo sed -i 's/display_errors = .*/display_errors = On/' /etc/php.ini sudo sed -i 's/error_reporting = .*/error_reporting = E_ALL/' /etc/php.ini sudo systemctl restart php-fpm

此时刷新后台,PHP致命错误(如Fatal error: Uncaught Error: Call to undefined function mb_convert_encoding())将直接显示在页面上,指向缺失的php-mbstring扩展。

6. 生产环境加固与日常维护

6.1 自动化备份脚本:三文件一数据库的分钟级快照

Typecho的核心资产是:config.inc.php(配置)、usr/目录(内容+插件)、theme/目录(主题)、数据库。以下脚本实现每日凌晨2点自动备份:

#!/bin/bash # 保存为 /root/backup_typecho.sh,赋予执行权限:chmod +x /root/backup_typecho.sh DATE=$(date +%Y%m%d_%H%M) BACKUP_DIR="/backup/typecho" WEB_ROOT="/var/www/html/typecho" # 创建备份目录 mkdir -p $BACKUP_DIR # 备份配置文件 cp $WEB_ROOT/config.inc.php $BACKUP_DIR/config_$DATE.php # 备份usr和theme目录(排除缓存) tar -czf $BACKUP_DIR/usr_$DATE.tar.gz -C $WEB_ROOT usr --exclude="usr/cache/*" # 备份数据库 mysqldump -u typecho_user -p'StrongPassw0rd!' typecho | gzip > $BACKUP_DIR/db_$DATE.sql.gz # 清理7天前备份 find $BACKUP_DIR -name "*.php" -o -name "*.tar.gz" -o -name "*.sql.gz" -mtime +7 -delete # 设置备份文件属主 chown -R root:root $BACKUP_DIR

添加定时任务:

# 编辑crontab sudo crontab -e # 添加一行: 0 2 * * * /root/backup_typecho.sh

6.2 日志监控:用journalctl直击故障源头

CentOS 7+使用systemd,所有服务日志统一由journalctl管理。快速定位Typecho相关问题:

# 查看Nginx最近100行错误日志 sudo journalctl -u nginx --since "1 hour ago" -n 100 -p err # 实时跟踪PHP-FPM错误(Ctrl+C退出) sudo journalctl -u php-fpm -f # 综合搜索关键词(如502、connect、denied) sudo journalctl -q | grep -E "(502|connect|denied|failed)" | tail -50

最后分享一个小技巧:Typecho的usr/plugins/目录下,任何插件启用前,务必检查其Plugin.php文件是否包含eval()、assert()、create_function()等危险函数。我曾发现某热门SEO插件用eval()动态执行用户输入的JavaScript,这等于在防火墙上开了个洞。安全第一,功能第二。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询