如何定义Apache2(2.4)CGI环境变量CONTEXT_DOCUMENT_ROOT
和CONTEXT_PREFIX
?
从实验中,我确定了以下内容:
CONTEXT_DOCUMENT_ROOT
或DirectoryIndex
调用CGI脚本时, ErrorDocument
似乎是原始请求的完整本地路径。
CONTEXT_PREFIX
或REQUEST_URI
调用CGI时, DirectoryIndex
似乎是原始ErrorDocument
,没有任何查询部分脚本。 (在这些情况下,REQUEST_URI
设置为CGI脚本的URI,而不是原始的。)
但是,我似乎无法在这些变量上找到Apache的任何官方文档。这里有没有人有这样的文档链接,或者更多权威知识要分享?
答案 0 :(得分:3)
CONTEXT_PREFIX
和CONTEXT_DOCUMENT_ROOT
告诉您apache如何使用Alias
指令(或类似功能 - 如mod_userdir
)将URL路径转换为文件系统路径。文件系统路径最终将指向要提供的文件或要运行的cgi脚本。
因此,如果apache翻译了URL:
http://host/_CONTEXT_PREFIX/path/file
到文件系统路径:
/_CONTEXT_DOCUMENT_ROOT/path/file
它表示存在Alias
(或ScriptAlias
或类似机制,例如mod_userdir
),如下所示:
Alias /_CONTEXT_PREFIX /_CONTEXT_DOCUMENT_ROOT
Alias
指令在${CONTEXT_PREFIX}
中保存 / _ CONTENT_PREFIX , / _ CONTEXT_DOCUMENT_ROOT 保存在${CONTEXT_DOCUMENT_ROOT}
。
以下是使用它的一个示例。在<Directory>
上下文RewriteRule
中,将相对于目录的路径名转换为绝对URL路径,或绝对文件名(必须存在)。因此,如果您想将以.htm结尾的网址翻译为.php,您必须这样写:
<Directory "/_CONTEXT_DOCMENT_ROOT">
<FilesMatch "*.htm">
RewriteEngine On
RewriteRule (.*)[.]html$ /_CONTEXT_DOCUMENT_ROOT/$1.php
</FilesMatch>
</Directory>
现在您可以在不重复/_CONTEXT_DOCUMENT_ROOT
的情况下编写它,但更重要的是,文件不必存在,因为我们将其重写为URL路径:
<Directory "/_CONTEXT_DOCMENT_ROOT">
<FilesMatch *.htm>
RewriteEngine On
RewriteRule (.*)[.].* ${CONTEXT_PREFIX}/$1.php
</FilesMatch>
</Directory>