apache2 CONTEXT_DOCUMENT_ROOT 和 CONTEXT_PREFIX 的含义?

Pi *_*ion 4 apache cgi

如何Apache2的(2.4)CGI环境变量CONTEXT_DOCUMENT_ROOTCONTEXT_PREFIX界定?

通过实验,我确定了以下内容:

  • CONTEXT_DOCUMENT_ROOTDirectoryIndexErrorDocument调用 CGI 脚本时,似乎是原始请求的完整本地路径。

  • CONTEXT_PREFIX似乎是原始的REQUEST_URI,没有任何查询部分,当DirectoryIndexErrorDocument已经调用 CGI 脚本时。(在这些情况下,REQUEST_URI设置为 CGI 脚本的 URI,而不是原始的。)

但是,我似乎无法从 Apache 中找到有关这些变量的任何官方文档。这里有人有此类文档的链接,或更权威的知识可以分享吗?

Rus*_*art 5

CONTEXT_PREFIXCONTEXT_DOCUMENT_ROOT告诉您 apache 如何使用Alias指令(或类似功能mod_userdir)将 URL 路径转换为文件系统路径。文件系统路径最终将指向要提供的文件或要运行的 cgi 脚本。

所以,如果 apache 翻译 URL:

    http://host/_CONTEXT_PREFIX/path/file
Run Code Online (Sandbox Code Playgroud)

到文件系统路径:

    /_CONTEXT_DOCUMENT_ROOT/path/file
Run Code Online (Sandbox Code Playgroud)

它意味着有一个Alias(或ScriptAlias类似的机制,例如mod_userdir),如下所示:

    Alias /_CONTEXT_PREFIX /_CONTEXT_DOCUMENT_ROOT
Run Code Online (Sandbox Code Playgroud)

Alias指令保存/ _CONTENT_PREFIX${CONTEXT_PREFIX}/ _CONTEXT_DOCUMENT_ROOT保存在${CONTEXT_DOCUMENT_ROOT}

这是使用它的一个示例。在<Directory>上下文中,RewriteRule将相对于目录的路径名转换为绝对 URL 路径或绝对文件名(必须存在)。因此,如果您想将以 .htm 结尾的 URL 转换为 .php,则必须这样编写:

    <Directory "/_CONTEXT_DOCMENT_ROOT">
        <FilesMatch "*.htm">
            RewriteEngine On
            RewriteRule (.*)[.]html$ /_CONTEXT_DOCUMENT_ROOT/$1.php
        </FilesMatch>
    </Directory>
Run Code Online (Sandbox Code Playgroud)

现在你可以不用重复编写它/_CONTEXT_DOCUMENT_ROOT,但也许更重要的是文件不一定存在,因为我们将它重写为 URL 路径:

    <Directory "/_CONTEXT_DOCMENT_ROOT">
        <FilesMatch *.htm>
            RewriteEngine On
            RewriteRule (.*)[.].* ${CONTEXT_PREFIX}/$1.php
        </FilesMatch>
    </Directory>
Run Code Online (Sandbox Code Playgroud)