Web服务器如何通过URL在服务器上找到文件?

smw*_*dia 5 webserver

有没有人试图实现Web服务器?或者了解一个有效的Web服务器程序的发动机故障?我想知道从Web服务器收到URL到Web服务器上的文件的确切位置,并作为响应发送回来.

服务器是否只保留一个内部表来记住它支持的URL和相应的本地路径之间的映射?还是有什么比较棘手的?

谢谢!

更新

谢谢你的回复.这是我现在的理解.

我检查了Microsoft IIS(Internet信息服务),我注意到IIS可以托管多个站点,并且foreach站点IIS记住它在本地文件系统上的根路径.同一主机上的不同站点共享相同的主机名或IP,它们由不同的端口区分.例如:

http://www.myServer.com:1111/folderA/pageA.htm
Run Code Online (Sandbox Code Playgroud)

Web服务器将使用www.myServer.com:1111 URL字符串的一部分来查找将使用其本地文件系统上的路径,然后在该本地路径中,它将搜索子文件夹folderA,然后搜索文件pageA.htm.

Web服务器只需要记住2个普通字符串之间的以下映射:

"http://www.myServer.com:1111/" <---> "D:\myWebRoot"
Run Code Online (Sandbox Code Playgroud)

我不知道这种映射信息存储在哪里,也许是有问题的Web服务器程序的一些配置文件.

但是这种映射粒度的结果是我们只能访问该映射本地文件夹中的内容.我们无法进行仲裁映射.

更新 - 2 -

我找到了IIS保存映射的位置,这里是applicationHost.config的一些引用:

<sites>
    <site name="Default Web Site" id="1" serverAutoStart="false">
        <application path="/">
            <virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:80:" />
            <binding protocol="net.tcp" bindingInformation="808:*" />
            <binding protocol="net.pipe" bindingInformation="*" />
            <binding protocol="net.msmq" bindingInformation="localhost" />
            <binding protocol="msmq.formatname" bindingInformation="localhost" />
        </bindings>
    </site>
    <site name="myIISService" id="2" serverAutoStart="true">
        <application path="/" applicationPool="myIISService">
            <virtualDirectory path="/" physicalPath="D:\MySites\MyIISService" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:8022:" />
        </bindings>
    </site>
    <siteDefaults>
        <logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
        <traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
    </siteDefaults>
    <applicationDefaults applicationPool="DefaultAppPool" />
    <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
Run Code Online (Sandbox Code Playgroud)

更新 - 3 -

在我阅读了foo的回复之后,我对"服务器"的不足之处被扩大了.我想根据我最近学习的WCF做一些评论.

无论它是什么类型的服务器,我们总是可以通过指定协议,URL,端口向它们发送消息.例如:

[http://www.myserver.com:1111/]page.htm

[net.tcp://www.myserver.com/]someService.svc/someMethod

[net.msmq://www.myserver.com/]someService.svc

[net.pipe://localhost/]
Run Code Online (Sandbox Code Playgroud)

在消息使用上述URL的方括号中的部分到达服务器程序之后,URL的其余部分将作为输入发送到服务器程序以进行进一步处理.并且以下行为可以像静态内容馈送一样简单,也可以像动态内容生成一样复杂.

foo*_*foo 3

取决于网络服务器及其关注点。

(对于所有项目,检查访问权限、重新映射等步骤当然适用。)

  • 像 Apache 这样的通用 Web 服务器从文件和目录开始,因此它们将 URL 拆分为分层路径描述,尝试在给定位置查找文件,如果存在则提供该文件。(对于模块和文件类型,这会变得更加复杂;某些文件类型意味着将文件作为脚本处理并返回脚本输出,而不仅仅是管道输出文件内容,等等)。

  • 像 Tomcat 这样的应用程序服务器会映射到 servlet;如果他们找到了可以处理该 URL 的 servlet,则会调用它并将任何剩余的 URL 部分/参数传递给它以进行进一步处理。

  • 嵌入式网络服务器甚至可以使用硬编码的查找表来获取可用的 URL 模式,直接映射到要调用的函数。

  • 专用网络服务器将执行任何需要的操作;有些甚至不会解析 URL,而只会解析其他标头(就像某些流媒体服务器所做的那样)。

这完全取决于您想要实现的目标。在大多数情况下,您最好使用 nginx 或 Apache,也许还有一些模块和/或微调。

请注意,任何HTTP 标头都可用于将请求映射到您拥有的任何生成输出的方式。主机名、端口和 URL 最常用,但您也可以采用语言或客户端 IP 或其他标头数据并在映射中使用它们。

所以对于你的问题:是的,可以这么简单;是的,它可能更加棘手(涉及映射、重写和复杂的处理)。