关键在于Nginx转发、PHP执行、框架路由、目录结构四者严丝合缝:root必须指向public,location /用try_files $uri $uri/ /index.php?$query_string,PHP块配全SCRIPT_FILENAME、PATH_INFO、PATH_TRANSLATED,且框架开启url_route_on=true。

在阿里云ECS(Ubuntu 20.04)上部署ThinkPHP 8.0并启用伪静态,关键不在“加一条rewrite”,而在于Nginx转发、PHP执行、框架路由、目录结构四者严丝合缝。任一环节错位,轻则URL带index.php,重则白屏或404,且错误常被静默吞掉,排查困难。
1. 服务器准备与基础环境确认
确保ECS实例满足最低要求:≥2核2G(推荐4核8G),系统镜像为Ubuntu 20.04 LTS(64位)。安全组仅开放必要端口:22(SSH)、80(HTTP)、443(HTTPS)——生产环境切勿开放21(FTP)、8000、9000等非必需端口。
登录后先更新系统并安装基础依赖:
- apt update && apt upgrade -y
- apt install nginx php-fpm php-mysql php-curl php-mbstring php-xml php-zip php-fileinfo unzip -y
检查PHP版本是否为8.0+:php -v;确认扩展已加载:php -m | grep -E "mbstring|curl|openssl|pdo"。缺失则编辑/etc/php/*/fpm/php.ini取消对应extension=行的注释,重启php-fpm服务。
2. 项目部署与Nginx root指向public
将ThinkPHP 8.0项目上传至ECS(如/var/www/myapp),务必保证目录结构符合TP8规范:入口文件index.php必须位于/var/www/myapp/public/下,vendor/、app/等在项目根目录。
Nginx的root指令必须指向public子目录,这是最易出错也最致命的一步。若root指向项目根目录(如/var/www/myapp),框架因autoload路径错误直接白屏,且无任何报错提示。
在/etc/nginx/sites-available/myapp中配置server块:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- root /var/www/myapp/public;(末尾分号不可省)
- index index.php;
- server_name your-domain.com;(生产环境务必用真实域名)
3. Nginx伪静态规则:try_files + 正确fastcgi_param
伪静态规则必须写在location / { }块内,且必须放在location ~ \.php$之前。禁用所有if (!-e $request_filename)写法——它在Ubuntu+Nginx组合下极易导致PATH_INFO为空,TP8路由静默失效。
标准配置如下:
- location / { try_files $uri $uri/ /index.php?$query_string; }
- location ~ \.php$ {
- include snippets/fastcgi-php.conf;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- fastcgi_param PATH_INFO $fastcgi_path_info;
- fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
- }
特别注意:SCRIPT_FILENAME必须用$document_root(由前面root指令赋值),不能用$request_filename或$realpath_root——后者在Ubuntu下可能因符号链接解析失败。
4. ThinkPHP框架层与生产环境加固
仅配Nginx不够,框架内部必须“接得住”伪静态请求:
- 确认config/app.php中'url_route_on' => true已开启
- 'pathinfo_depr' => '/'保持默认,与Nginx规则一致
- 删除项目根目录下的.env文件(或确保其不包含敏感信息),并设APP_DEBUG=false
- 设置目录权限:chmod -R 755 /var/www/myapp,runtime目录需可写:chmod -R 775 /var/www/myapp/runtime
验证步骤:先运行nginx -t检查语法,再systemctl reload nginx;访问http://your-domain.com/index.php/index/hello确认基础功能;最后访问http://your-domain.com/index/hello,地址栏不跳转、页面正常即伪静态生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










