【问题标题】:What's the difference between scriptName and pathInfo in JSGI/Level0/A/Draft2?JSGI/Level0/A/Draft2中的scriptName和pathInfo有什么区别?
【发布时间】:2011-08-16 15:14:37
【问题描述】:
我正在使用 RingoJS 0.8,并在 ringo/httpserver 实例之上创建了一个基本的 jsgi 应用程序。我试图根据规范了解 jsgi 请求对象中每个键的用途:http://wiki.commonjs.org/wiki/JSGI/Level0/A/Draft2;我了解了大部分键,保存 scriptName 键。
当我运行我的应用程序并打印每个键的值时,scriptName 总是返回一个空字符串,而 pathInfo 返回 URL 的路径名。我试图了解 scriptName 实际应该传达的内容以及它与 pathInfo 的不同之处。
【问题讨论】:
标签:
javascript
commonjs
ringojs
【解决方案1】:
scriptName 和 pathInfo 最好在考虑 CGI 的历史背景时被理解,因为这就是这些领域的起源。
使用CGI 脚本,您有一个服务器端目录结构,其中包含某个位置的CGI 脚本。对于 CGI,Web 服务器的工作是将 HTTP 请求中的 URL 映射到 CGI 脚本。现在这个映射过程基本上将 URL 中的路径拆分为组件,然后尝试(从根目录开始)将每个组件映射到目录名或文件名。一旦组件与文件名匹配,就会找到要执行的 CGI 脚本。所有指向并包括文件名的 URL 路径组件然后作为“脚本名称”传递给 CGI,其余(不匹配的)URL 路径组件作为“路径信息”传递给 CGI 脚本。
让我们用一个例子来说明这个抽象描述。假设您有一个 CGI 脚本存储在您的文件系统中 /x/y/foo/bar.cgi,其中 /x/y/ 是您的网络服务器用于将请求映射到的根目录。如果对 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 应用,则由您决定(并记录)是否以及如何设置 scriptName 和 pathInfo。