我有点搞不懂 URL 是如何工作的。以前,当我学习 HTML 之类的东西时,我知道域名后面的内容是我们要加载的文件的位置(例如 website.com/somefolder/somefile.html)。而且它很简单,我能理解。
最近我不得不学习一些有关网络的知识,我发现 URL 更加复杂。例如:
- drupal 链接类似于 somewebsite.com/node/43
- REST 请求类似于 somewebsite.com/books/32
- 在 '?' 之后你可以传递一些参数
这是怎么回事?服务器(或者其他什么东西?我是个新手)收到请求时如何知道 URL 的含义?可能是:
- 资源位置
- drupal 视图
- REST 请求
- 还有什么其他的事情吗?
我不知道我的问题是否有意义,我希望你能理解我的困惑。
答案1
这是如何运作的?
服务器决定。
当服务器(或者其他什么东西?我是个新手)收到请求时,如何知道 URL 的含义?
服务器依赖于其配置。对于基于 Unix 的服务器,这通常由一个或多个文本文件处理,这些文件通常称为“配置”文件。设置服务器时,您可以指定这一点。如何指定这一点的详细信息将根据您使用的 Web 服务器软件而有所不同。
(流行的 Web 服务器和 CGI 包往往有大量教程,因此如果网站管理员不知道如何操作,他通常会开始阅读示例/文档/教程。因此,如果您查找有关 Apache 等 Web 服务器的文档,您很可能会找到有关设置 Drupal 的信息。另一方面,如果您查找有关 Drupal 之类的信息,您可能会找到有关如何配置 Apache 以使用 Drupal 的文档部分。有了这么多可用的文档,网站管理员通常不需要费太大劲就能找到他们想要使用的软件包的相关详细信息。)
HTTP 1.1 客户端倾向于将 URL 拆分为 3 个部分:
- 协议(例如 http/https)
- 网站(例如 example.com)
- 资源(例如/somedir/file.htm)
这可能有点过于简单了。一些较旧的 URL 允许类似ftp://用户名@密码:example.com/somedir/file尽管较新的网络浏览器已倾向于取消此类支持,例如微软知识库 8344389出于安全考虑(包括已经发生的大量滥用行为,例如http://paypal.com/gibberish%40PhishingSite.example.com/gibberish会将 %40 转换为 ASCII 64,即 @,从而导致用户名 paypal.com/gibberish 被用于登录 PhishingSite.example.com,而 PhishingSite.example.com 只会接受登录,并要求人们提供他们的 PayPal 密码。人们会在 URL 开头看到 paypal.com 并信任它。
当然,有一些“标准”,例如 URL 中的 # 是 Web 客户端可以识别的,并且不会将其发送到服务器。相反,Web 客户端会将 # 后面的文本视为要跳转到的锚文本。此外,% 用于转义十六进制字符。Web 客户端往往理解这一点。
其他细节可能取决于服务器。例如,许多 Web 服务器以 ? 开始参数列表,并使用 &(或许多分号?)在参数列表中拆分参数。但是,这只是许多 Web 服务器表现出的常见行为。HTTP 中没有任何部分强制 Web 服务器遵守这一点。实际上,Web 服务器可以按照自己的意愿处理这一点,并且 Web 客户端不太可能需要任何特殊支持。
如果您曾经设置过 HTTP 服务器,那么您可能会明白,配置的一部分是指定如何处理所请求的资源。例如,您可以说发送到 / 的所有内容都将从本地硬盘的 /srv/httpdocs/ 区域加载文件,但 /cgi-bin/ 除外,它将运行位于 /cgi-bin/ 中的程序,而 /scripts/ 下以 .pl 结尾的任何内容都将由 PERL 解释器运行。
具体细节因 Web 服务器的配置而异,因此没有一个通用标准可以告诉 Web 客户端是否可以保证收到静态页面的副本或运行的程序的输出。Web 客户端所能期望的只是,如果 Web 客户端请求资源,Web 服务器将对其做出响应。
答案2
网络服务器没有知道所有这些含义 – 在所有情况下,它只是接收资源路径,通过网站的主程序运行它,并向您发送结果输出。当然,不同的程序会根据给定的路径执行不同的操作。
如果没有配置文件,它会查找具有该名称的文件并直接提供服务。(PHP 和 CGI 通常介于两者之间:Web 服务器仍然查找文件,然后运行该文件本身作为程序。
因此,使其成为“Drupal 视图”的唯一原因/node/43
是 Web 服务器已配置为传递/node/<anything>
给 Drupal 软件。即使网页是动态生成的,它仍被视为资源。
(当然,Drupal 本身知道,如果路径以/node/
它开头,后面会跟着视图 ID。)
REST 请求也是完全常规的资源请求;使它们“RESTful”的只是整体风格和行为。(例如, 风格的 URL/book/345
符合 REST 理念,而 则不/api/get_book?id=345
符合。)