15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
09.10.2024

您的托管账户中的`www`和`public_html`目录是什么?

`public_html` 目录是您网站的文档根目录——服务器端文件夹,当访客加载您的域名时,您的 Web 服务器(Apache、Nginx、LiteSpeed)从该文件夹读取并提供所有可公开访问的文件。在大多数共享主机和基于 cPanel 的环境中,`www` 目录只是一个指向 `public_html` 的符号链接(symlink),它的存在是出于历史兼容性考虑,而非独立的存储位置。

理解这一区别并非表面功夫。将文件错误放置在 `public_html` 之外、错误配置文档根目录,或误解符号链接关系,都可能导致部署失败、403 Forbidden 错误,或无意中将敏感配置文件暴露于公众。

`public_html` 作为文档根目录的作用

当 HTTP 请求到达您的服务器时,Web 服务器守护进程会查阅其配置,以确定哪个目录映射到所请求的域名。该目录称为文档根目录。在几乎所有共享主机环境以及大多数运行 cPanel 或类似控制面板的 VPS 主机配置中,该文档根目录均为 `public_html`。

在典型的 cPanel 服务器上,绝对路径如下所示:

“`

/home/username/public_html/

“`

放置在此目录中的任何文件都可通过您的域名公开访问。映射关系是直接的:

服务器上的文件路径公开 URL
`/home/user/public_html/index.html``https://example.com/`
`/home/user/public_html/about.html``https://example.com/about.html`
`/home/user/public_html/images/logo.png``https://example.com/images/logo.png`
`/home/user/public_html/blog/post-1.php``https://example.com/blog/post-1.php`
`/home/user/secret-config.php` *(位于 public_html 之外)*无法通过浏览器访问

最后一行至关重要。放置在目录树中 `public_html` 上方的文件——直接位于 `/home/username/` 中——对 Web 服务器不可见,无法通过 HTTP 获取。这是存放敏感文件的正确位置,例如数据库凭据、`.env` 文件以及应用程序在运行时读取但绝不能公开提供的 API 密钥。

默认索引文件与目录解析

当访客请求目录 URL(例如 `https://example.com/`)时,Web 服务器会在该目录中查找默认索引文件。Apache 的 `DirectoryIndex` 指令中的标准解析顺序通常为:

“`

index.html > index.htm > index.php > index.cgi

“`

如果这些文件均不存在且未明确禁用目录列表,服务器可能返回 403 Forbidden 或暴露目录列表——这是一个重大安全风险。请始终确保存在有效的索引文件,或在您的 `.htaccess` 中设置 `Options -Indexes`。

`www` 目录的实际含义

`www` 目录是一个 POSIX 符号链接,而非拥有独立 inode 和存储分配的真实目录。您可以在任何基于 Linux 的服务器上验证这一点:

“`bash

ls -la ~/

“`

输出将显示类似以下内容:

“`

lrwxrwxrwx 1 user user 10 Jan 15 09:22 www -> public_html

drwxr-xr-x 12 user user 4096 Jan 15 09:22 public_html

“`

权限字符串开头的 `l` 和 `-> public_html` 箭头确认它是一个符号链接。这意味着:

  • `www` 和 `public_html` 共享完全相同的 inode 数据
  • 向 `~/www/contact.html` 写入文件与向 `~/public_html/contact.html` 写入文件完全相同
  • 删除 `www` 不会删除 `public_html` 或其任何内容
  • 重新创建符号链接非常简单:`ln -s ~/public_html ~/www`

`www` 符号链接存在的原因

`www` 符号链接是一个具有实际根源的历史遗留产物。在早期基于 Unix 的主机环境中,惯例是将 Web 内容存储在字面上命名为 `www` 的目录中——这反映了 1990 年代无处不在的 `www.` 子域名前缀。随着 cPanel 将 `public_html` 标准化为文档根目录名称,`www` 符号链接被保留下来,以避免破坏:

  • 硬编码为写入 `~/www/` 的旧版部署脚本
  • 期望存在 `www` 文件夹的 FTP 客户端和文件管理器
  • 将 `www` 作为上传目标的文档和教程

在现代环境中,出于所有实际目的,您应将 `public_html` 视为规范位置,完全忽略 `www`。

`public_html` 与 `www`:直接对比

属性`public_html``www`
类型真实目录符号链接
是否为实际文档根目录否(指向 `public_html`)
是否独立包含文件否(共享 `public_html` 的 inode)
是否可安全删除否(会破坏网站)是(网站继续正常运行)
是否存在于所有主机类型不保证
推荐的上传目标不推荐
是否存在于 VPS/自定义设置可配置很少,除非手动创建

`public_html` 内部的目录结构

组织良好的 `public_html` 目录能够清晰地分离关注点。以下是基于 PHP 的网站或 WordPress 安装的生产级真实结构:

“`

public_html/

├── index.php

├── .htaccess

├── wp-config.php ← WordPress config (ideally moved one level up)

├── wp-content/

│ ├── themes/

│ ├── plugins/

│ └── uploads/

├── assets/

│ ├── css/

│ ├── js/

│ └── images/

└── sitemap.xml

“`

重要安全提示:`wp-config.php` 包含数据库凭据。WordPress 支持将此文件放置在 `public_html` 上方一级目录(`/home/username/wp-config.php`),在该位置它无法通过 HTTP 访问,但 PHP 仍可读取。这是许多管理员忽视的安全加固最佳实践。

子域名和附加域名如何扩展此结构

当您通过 VPS 控制面板或 cPanel 创建子域名或附加域名时,主机系统会创建一个新的文档根目录——要么位于 `public_html` 内部,要么作为同级目录位于相同层级。

子域名文档根目录

“`

/home/username/public_html/blog/ → blog.example.com

/home/username/public_html/shop/ → shop.example.com

“`

或者,在某些 cPanel 配置中:

“`

/home/username/blog.example.com/ → blog.example.com

“`

附加域名文档根目录

“`

/home/username/public_html/newdomain/ → newdomain.com

“`

或作为顶级同级目录:

“`

/home/username/newdomain.com/ → newdomain.com

“`

确切路径取决于您的主机面板配置。请始终在 cPanel 的域名 > 子域名附加域名中验证文档根目录,以避免将文件上传到错误位置。

不同主机环境中的行为差异

共享主机(cPanel)

在使用 cPanel 的共享虚拟主机上,结构是标准化的:

  • 文档根目录:`/home/username/public_html/`
  • `www` 符号链接:默认存在
  • 支持 `.htaccess` 的 Apache:已启用
  • 多个域名:每个域名获得其自己的子目录或并行文件夹

VPS 和独立服务器

独立服务器或自管理 VPS 上,文档根目录完全由管理员在 Web 服务器配置中定义。常见惯例:

Apache 虚拟主机(`/etc/apache2/sites-available/example.com.conf`):

“`apache

<VirtualHost *:80>

ServerName example.com

ServerAlias www.example.com

DocumentRoot /var/www/example.com/public_html

</VirtualHost>

“`

Nginx 服务器块(`/etc/nginx/sites-available/example.com`):

“`nginx

server {

listen 80;

server_name example.com www.example.com;

root /var/www/example.com/public_html;

index index.php index.html;

}

“`

在这些环境中,`public_html` 是一种命名惯例,而非技术要求。文档根目录可以命名为任何名称——`/var/www/html/`、`/srv/www/`、`/opt/app/public/`——只要 Web 服务器配置指向它即可。`www` 符号链接通常不存在,除非您手动创建。

cPanel VPS

带 cPanel 的 VPS 将 VPS 的灵活性与共享主机标准化的 `public_html` 结构相结合,使其成为 `www` 和 `public_html` 完全按照本文所述共存的最常见环境。

文件权限:一个常被忽视的要求

不正确的权限是导致 403 Forbidden 错误和部署失败最常见的原因之一。Web 可访问文件的标准权限模型:

资源推荐权限八进制
目录所有者和组的读取 + 执行权限`755`
PHP/HTML 文件所有者读写,其他人只读`644`
配置文件(`.env`、凭据)仅所有者`600`
可执行脚本仅所有者执行`700`

使用以下命令递归设置权限:

“`bash

find ~/public_html -type d -exec chmod 755 {} ;

find ~/public_html -type f -exec chmod 644 {} ;

“`

切勿在生产环境中对任何文件或目录设置 `777`。这会向所有系统用户授予写入权限,是服务器遭受攻击的直接途径。

SSL、HTTPS 与文档根目录

当您在域名上安装 SSL 证书时,证书绑定到域名,而非特定目录。但是,HTTPS 虚拟主机配置必须指向与 HTTP 配置相同的 `public_html` 文档根目录。如果 HTTP 从一个目录提供服务而 HTTPS 从另一个目录提供服务,则会产生不一致的行为,这种问题出了名地难以诊断。

如果您通过 Certbot 使用 Let’s Encrypt,ACME 质询验证过程会将临时文件放置在 `public_html/.well-known/acme-challenge/` 中。请确保此路径未被 `.htaccess` 规则或拒绝访问隐藏目录(以 `.` 开头的目录)的 Nginx `location` 块所阻止。

实用关键要点清单

上传网站之前:

  • 在您的主机面板中确认确切的文档根目录路径——不要假设它始终是 `/home/username/public_html/`
  • 验证 `www` 是符号链接而非独立目录,以避免重复的文件管理
  • 将敏感配置文件(`.env`、数据库凭据)移至 `public_html` 上方

部署期间:

  • 将目录权限设置为 `755`,文件权限设置为 `644`
  • 确保文档根目录中存在 `index.html` 或 `index.php`,以防止目录列表
  • 在 `.htaccess` 中禁用 `Options Indexes` 作为纵深防御措施

对于多域名设置:

  • 分别确认每个子域名和附加域名的文档根目录
  • 不要假设所有域名共享相同的 `public_html`

在 VPS 和独立服务器环境中:

  • 在您的虚拟主机或服务器块配置中明确定义文档根目录
  • `www` 符号链接默认不存在——仅在旧版脚本需要时才创建它
  • 任何配置更改后重启 Web 服务器:`systemctl reload apache2` 或 `systemctl reload nginx`

安全加固:

  • 切勿在 `public_html` 内存储 API 密钥、`.env` 文件或数据库配置
  • 定期审计 `public_html`,特别是 `uploads/` 目录中的意外文件
  • 确保您的 SSL 虚拟主机指向与 HTTP 配置相同的文档根目录

常见问题解答

如果我删除 `www` 目录会发生什么?

如果 `www` 是符号链接(在几乎所有 cPanel 环境中都是如此),删除它对您的网站或其文件没有任何影响。您的网站继续正常运行,因为实际内容存储在 `public_html` 中。您可以随时使用 `ln -s ~/public_html ~/www` 重新创建符号链接。

我可以将 `public_html` 重命名为其他名称吗?

在共享主机上,不可以——控制面板硬编码使用 `public_html` 作为文档根目录。在自管理 VPS 或独立服务器上,您可以将文档根目录命名为任何名称,前提是您更新 Web 服务器配置(Apache 中的 `DocumentRoot`,Nginx 中的 `root`)以匹配。

为什么即使我的文件在 `public_html` 中,我仍然收到 403 Forbidden 错误?

最常见的原因是文件权限不正确(文件至少需要 `644`,目录需要 `755`)、在禁用目录列表的情况下缺少索引文件,或者 `.htaccess` 规则阻止了访问。请查看 Web 服务器错误日志(`/var/log/apache2/error.log` 或 `/var/log/nginx/error.log`)以获取具体原因。

我应该将 PHP 需要读取但不应公开访问的文件存储在哪里?

将它们放置在 `public_html` 上方的目录中,例如 `/home/username/private/` 或直接放在 `/home/username/` 中。PHP 可以读取文件系统上 Web 服务器用户有权访问的任何位置的文件,但 Web 服务器不会通过 HTTP 提供文档根目录之外的文件。

在服务器层面,`www` 子域名与非 www 域名的工作方式有何不同?

没有区别。`www.example.com` 和 `example.com` 都通过 DNS 配置和虚拟主机设置解析到相同的文档根目录。文件系统上的 `www` 目录符号链接与 `www.` DNS 子域名无关——它们是恰好共享相同三个字母的独立概念。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用