JSGI/Level0/A/Draft2中的scriptName和pathInfo有什么区别?

问题描述:

我正在使用RingoJS 0.8,并且我在ringo/httpserver实例上创建了一个基本的jsgi应用程序。我试图根据规范了解jsgi请求对象中每个键的用途:http://wiki.commonjs.org/wiki/JSGI/Level0/A/Draft2;并且我了解了大多数键,保存了scriptName键。JSGI/Level0/A/Draft2中的scriptName和pathInfo有什么区别?

当我运行我的应用程序并打印每个键的值时,scriptName始终返回一个空字符串,而pathInfo返回URL的路径名。我试图理解scriptName实际上应该传达什么,以及它是如何与pathInfo不同的。

scriptNamepathInfo当考虑到CGI的历史背景时最好理解,因为那是那些领域的源泉。

随着CGI脚本,你有一个服务器端的目录结构,其中包含一个位置的CGI脚本。对于CGI,Web服务器的工作是将HTTP请求中的URL映射到CGI脚本。现在这个映射过程基本上将URL中的路径分成组件,然后尝试(从根目录开始)将每个组件映射到目录名或文件名。一旦组件与文件名相匹配,就找到要执行的CGI脚本。然后将所有包含文件名的URL路径组件作为“脚本名称”传递给CGI,剩余的(不匹配的)URL路径组件作为“路径信息”传递给CGI脚本。

让我们用一个例子来说明这个抽象描述。假设您的文件系统中存储了一个CGI脚本/x/y/foo/bar.cgi,其中/x/y/是Web服务器用来映射请求的根目录。如果请求的URL为/foo/bar.cgi/baz/qux,则网络服务器会将此请求与/x/y/foo/bar.cgi CGI脚本相匹配,并将/foo/bar.cgi作为“脚本名称”,其余/baz/qux作为此路径信息传递给此CGI脚本。

然而,在JSGI它基本上到服务器潜在的中间件如何URL来JSGI应用程序映射完成。有可能是一个基于模拟文件系统的查找机制在工作,其中原始请求的路径分裂为“脚本名称”和“路径信息”仍然有意义。或者可能没有。

如果您在Ringo的裸机ringo/httpserver上运行,则根本不会执行脚本名称映射,因为您的应用始终被认为是在根目录下运行(即对应于/ URL路径)。如果您的主应用程序委托给其他JSGI应用程序,那么您需要决定(并记录)是否以及如何设置scriptNamepathInfo