thinkphp public目录部署到阿里云虚拟主机_目录结构与权限设置
thinkphp入口文件放在public目录的核心目的是安全——把应用代码、配置文件、日志等敏感信息放在public目录之外,用户通过域名只能访问到public目录下的文件,无法直接访问应用目录。这种部署方式能有效防止配置文件泄露、代码被直接下载等安全风险。本文详细讲解如何正确配置public目录作为运行目录,以及各种环境下的适配方案。
虚拟主机的PHP版本选择也很重要。thinkphp5.0要求PHP5.4以上,5.1要求PHP5.6以上,6.0要求PHP7.1以上。在虚拟主机面板中切换到对应PHP版本,同时确保开启了必要的扩展如pdo_mysql、mbstring、curl、gd、openssl等。扩展缺失会导致框架运行报错或功能异常。
国内很多虚拟主机不支持自定义网站根目录,域名默认指向空间根目录,无法直接绑定到public子目录。这种情况下有两种解决方案。方案一:把thinkphp项目的应用目录(app、config、route、runtime、vendor)上传到空间根目录之外的目录,把public目录下的文件上传到空间根目录,然后修改index.php中的应用路径为../应用目录名/。这种方式最安全也最规范。
方案二:整个项目上传到空间一个子目录如tp项目,然后在空间根目录创建index.php,内容为require 'tp项目/public/index.php',同时在根目录创建.htaccess或web.config把所有请求转发到这个入口文件。这种方式简单但应用目录在web可访问范围内,需要额外添加访问保护规则防止敏感文件被直接访问。
iis环境下把public设为运行目录,在IIS管理器中找到对应网站,右键「管理网站」-「高级设置」,把物理路径改为项目的public目录路径。或者在网站根目录设置中直接修改物理路径。修改后应用池不需要重启,但建议刷新网站确保配置生效。
iis7及以上版本支持URL重写模块,需要先安装URL Rewrite扩展。安装后在public目录下创建web.config文件,配置重写规则。核心规则:
iis的FastCGI配置中要确保PHP处理程序映射正确。在IIS管理器中找到「处理程序映射」,确认有一个指向php-cgi.exe的FastCGI映射,路径正确且限制动词为GET,HEAD,POST。如果没有这个映射,PHP文件会被直接下载而不是执行,入口文件就无法正常运行。
public目录作为网站根目录后,原来放在根目录的robots.txt、favicon.ico、sitemap.xml等文件也要移到public目录下。这些文件需要能被直接访问到,放在public目录外会返回404。robots.txt中禁止抓取的路径也要相应调整,确保不会误屏蔽public下的静态资源目录。
thinkphp框架的标准目录结构中,public目录与app、config、route、runtime、vendor等目录平级。public目录下放置入口文件index.php、静态资源目录static、.htaccess或web.config重写规则文件。其他目录全部位于public之外,用户通过域名只能访问到public目录的内容,应用代码和配置文件无法被直接访问。
nginx环境下把public设为运行目录,核心是修改server块中的root指令指向public目录。配置示例:server { listen 80; server_name 域名.com; root /www/wwwroot/项目名/public; index index.php index.html; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } location ~ .php$ { fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
nginx配置中还要注意fastcgi_param SCRIPT_FILENAME必须用$document_root$fastcgi_script_name,不能写死路径。$document_root会自动取root指令的值即public目录路径,这样入口文件路径就是public/index.php,正确无误。如果写死路径可能导致入口文件找不到或路径错误。
nginx伪静态规则的作用是把所有不存在的文件请求转发到index.php入口文件处理。location /块中的if判断$request_filename是否存在,不存在就rewrite到/index.php?s=$1,把原始路径作为参数传给入口文件。这条规则是thinkphp在nginx下URL重写的核心,缺少这条规则会导致除首页外所有页面404。
运维评价:「给客户部署thinkphp项目一直用public作为根目录的方案,安全合规,配合upload目录禁止PHP执行的规则,从来没出过被上传webshell的问题」「虚拟主机不支持根目录绑定的方案非常实用,很多老客户用的虚拟主机都不支持,按方案二部署都能正常运行」。
安全提醒:public目录作为运行目录后,不要把config配置文件、.env环境变量文件、runtime日志目录放在public下,这些文件包含数据库密码、API密钥等敏感信息,一旦被直接访问会造成严重安全事故。上传目录必须禁止PHP执行,这是防止webshell上传的关键措施。定期检查public目录文件列表,发现异常文件立即删除并排查入侵痕迹。

更新时间:2026-08-26 20:48:29
上一篇:虚拟主机TLS版本_修复实操