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

时间:2011-01-22 04:56:58

标签: webserver

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

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

谢谢!

更新

感谢您的回复。这是我现在的理解。

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

http://www.myServer.com:1111/folderA/pageA.htm

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

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

"http://www.myServer.com:1111/" <---> "D:\myWebRoot"

我不知道这种映射信息存储在哪里,也许是有问题的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>

更新 - 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/]

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

3 个答案:

答案 0 :(得分:3)

对于提供“文件”的服务器,一种典型的方法是将URL的路径部分视为从服务器配置中定义的“Web根目录”开始的相对路径。但是,URL根本不必与磁盘上的文件相对应;它可以对应于正在运行的Web应用程序,数据库记录或其他任何内容中的对象或方法。

答案 1 :(得分:3)

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

(对于所有项目,当然要检查访问权限,重新映射和此类步骤。)

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

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

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

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

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

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

所以对于你的问题:是的,它可以像那样简单;是的,它可能更加棘手(使用映射,重写和复杂处理)。

答案 2 :(得分:1)

对于静态文件,通常没有映射方法。 Web服务器需要知道的唯一内容是公共Web文档根目录的绝对磁盘文件系统路径,该路径通常在某些部署配置文件(httpd.conf中用于Apache HTTPD,server.xml和/或{ {1}}用于Apache Tomcat等)。 Web服务器从URL中提取相关部分,根据Web文档根路径将其转换为绝对磁盘文件系统路径,将文件定位到磁盘上并对其进行流式处理。