它还没有完成,但它非常适合......
看。您的网站同时存在于两个领域:真实领域和虚拟领域。
对于网站用户来说,它是一个虚拟网络服务器,您必须了解它的一个非常重要的事情:网络服务器上没有文件。想象一下,您在地址栏中输入http://example.com/index.html。它不是文件也不是路径,而是 URL,HTTP 资源。 虚拟地址,与常规文件完全不同。
对于您作为网站开发人员而言,网络服务器是在计算机上运行的程序。这台计算机很可能有一个硬盘和一个文件系统。您的 PHP 脚本在处理数据或包含其他脚本时,会操作物理磁盘上的文件。
这种差异对于初学者来说是一个非常常见的陷阱。
他们中的许多人将文件与超链接混淆,尝试使用 HTTP 协议调用本地文件或使用来自 Web 服务器根目录的虚拟路径包含文件。
此外,有两件事妨碍正确理解:
- 一种语言的开发人员,他们想要变得“好”并使文件系统功能也可以与虚拟资源一起使用
- 一台本地开发PC,它允许使用虚拟资源的文件系统路径,它会工作。或者更糟糕的是,将文件从客户端复制到服务器!
要小心,不要让他们欺骗你。
好吧,毕竟这不是火箭科学。一个人只需要了解这三件事:
- 物理文件和虚拟资源的区别。
-
root 是什么东西,文件系统根目录和网络服务器根目录有什么区别
- 绝对路径和相对路径的区别。
第一个很容易区分:
-
客户端请求的是 HTTP 资源,而不是您的程序
- 您的程序请求了一个文件,而客户端无法访问它
一个文件属于文件系统。它是存储在硬盘上的一段数据。它有几个属性,例如大小、修改时间、所有者、权限等。它是明确的文件系统属性,没有 HTTP 资源拥有它。
数据文件和您的脚本都是文件,应该这样对待。如果您执行include 'http://yoursite.com/file.php'; 之类的操作,则您没有按预期包含 PHP 代码,而只是包含纯 HTML - file.php 执行的结果!
如果您想从目录中读取图像名称,请不要从http://yoursite.com/image/ 中读取它。它不是目录。
另一方面,HTTP 资源是 HTTP 协议的东西。您的网络服务器是一个守护进程,它侦听请求。在收到对由 URI 标识的特定资源的请求后,它会查找该资源,并(如果找到)返回其内容以及几个 HTTP 标头。
一个网络服务器有它自己的目录结构,但是理解这个目录结构是虚拟的非常重要。它只是类似于一个真正的文件系统,但它根本不是一个文件系统。
/dir/、/dir/file.ext、/dir/whatever - 虽然所有这些路径看起来不同,但它们都是相同的。
这是一个棘手的主题,但理解起来非常重要。
HTTP 中没有文件或目录。但只是 resources,它由 headers 和 body 组成。
如果您从服务器请求/dir/ URI,您将获得标头和正文。
如果你从服务器请求/dir/file.ext URI,你会得到一个标题和一个正文。
每次你从服务器请求某些东西时,你都会得到一个标题和一个正文。
唯一可能的例外是包含标头但没有正文的响应。
虽然某些资源可能类似于文件,但它们不是文件。它们没有属性,只有标题。真是不一样的境界。
当然,大多数时候网络服务器只是找到与请求的 URI 对应的物理文件并将其输出。但它不再是一个文件,而只是文件的内容,前面有一些标题。
是的 - 这就是区别:将文件区分为文件系统主题及其内容是最重要的。
如果你请求一些看起来像目录的东西,你实际上会得到……一个 HTML 代码!根据文件系统形式的 HTML 代码(前面有一些标题)来区分目录非常重要。 (当然,您可以获得的不是 HTML,而是一些二进制文件内容 - 这只是 Content-type 标头的问题。另一个不将现实世界与虚拟世界混淆的原因)
结论:
如果您希望脚本直接访问文件 - 将其作为文件寻址。 不要通过 HTTP 调用它!(请注意,您的 php 脚本是文件 ;-)
如果您希望客户端使用 HTTP 协议访问相同的文件 - 将其作为虚拟资源寻址。
接下来,root。
嗯,根是根。一个起点。一切开始的地方。
文件系统和网络服务器都有自己的根源。
在 Unix 系统上,文件系统根是/。 请注意,它不仅仅是一个目录分隔符! 如果路径从该符号开始,则它是特定目录的名称 - 根目录。每个其他文件和目录都属于根目录。
在 Windows 系统上,它非常混乱(像往常一样)。没有通用的文件系统根,而是具有自己的根的单独磁盘。它以磁盘驱动器号和反斜杠开头:C:\ 是驱动器 C 的根目录。
网络服务器有它自己的根。一个虚拟世界与真实世界相遇的地方。从服务器的角度来看,Web 服务器根目录(通常称为 DOCUMENT_ROOT)是一个文件系统目录,Web 服务器在其中查找代表 HTTP 资源的文件。对于客户来说,它是完全合格的根——网站开始的地方。它看起来像 Unix 系统根 - /。客户端对服务器的文件系统一无所知。对于客户端,这个/ 是唯一的根。
结论:
永远知道你的根在哪里。
对于网络服务器来说很简单:总是/。
对于文件系统,知道虚拟根与现实世界的交汇点——一个 DOCUMENT_ROOT。它将帮助您找到自己的文件。
绝对路径和相对路径。
这很简单。
实际上,只有绝对路径是真实的。虽然相对路径是可以想象的,并且每条相对路径在使用前总是转换为 abaolute 路径。
绝对路径与root 密不可分。事实上,绝对路径是从根开始构建的路径:
- /var/www/site/forum/index.php
- с:\windows\command.com
- /img/frame.gif
如您所见,前两个是文件系统路径,分别来自unix和windows,而第三个无法明确定义,但很可能是虚拟HTTP资源。
每条不包含根目录的路径都是相对路径。它从 current location:
- 文件.php
- ./file.php
- 图片/图片.jpg
- ../file.php
- ../../file.php
结论:
尽可能使用绝对路径。无论当前目录如何,它都是明确的并且可以在任何地方使用。它可能包含可变部分,让它在不同的环境中工作,但最后它应该始终是绝对的。