在使用Apache的VirtualDocumentRoot时遇到了问题

最近我是一个喜欢厨师(Chef)的人,我的名字是arai。

厨师与此无关,但我在Apache的虚拟主机上使用VirtualDocumentRoot遇到了一点问题,只是做个备忘录。

通常的文件根目录是像这样的。
文件根目录 /var/www/vhosts/example.jp/httpdocs
虚拟文件根目录可以这样描述。
虚拟文件根目录 /var/www/vhosts/%0/httpdocs

我用这个设置之后遇到了许多问题。

第一个问题

当在PHP中包含另一个文件时,它会查看Apache的默认DocumentRoot(/var/www/html),从而导致错误。

                      :
  <?php include($_SERVER['DOCUMENT_ROOT'] . '/common/header.php'); ?>
                      :

错误信息 (Mistake information)

在/var/www/vhosts/example.jp/httpdocs/index.php中,包含(/var/www/html/common/header.php)失败,无法打开流:文件或目录不存在。

为什么

PHP 在服务器环境中,变量 $_SERVER[‘DOCUMENT_ROOT’] 会查看 Apache 的默认 DocumentRoot,从而导致错误。

解决方案

创建以下文件,并在Apache端使用php_admin_value auto_prepend_file进行加载。

<?php
$_SERVER['DOCUMENT_ROOT'] = "/var/www/vhosts/example.jp/httpdocs";
?>
<VirtualHost *:80>
    VirtualDocumentRoot /var/www/vhosts/%0/httpdocs
    php_admin_value auto_prepend_file /etc/httpd/conf/vhosts/example_document_root.php
          :
          :
</VirtualHost>

※ 以上的文件是从httpd.conf中进行包含的。

Can you provide context or clarify what exactly you would like to paraphrase in Chinese for Question 2?

在CLI(命令行界面)中运行PHP时,会导致PHP内部的$_SERVER [‘DOCUMENT_ROOT’]指向Apache的默认文档根目录(/var/www/html),而不是通过HTTP(即http://)访问时的路径。

造成这个结果的因素 or 引起这种情况的原因

类似地,当使用PHP时,服务器环境变量$_SERVER[‘DOCUMENT_ROOT’]会查看Apache的默认DocumentRoot,这样会导致错误。

解决方案 (Solution)

(Note: This is the native Chinese translation of “solution” which is commonly used to mean “method” in this context.)

在PHP中,可以这样修改服务器环境变量。
$_SERVER[‘DOCUMENT_ROOT’] = “/var/www/vhosts/example.jp/httpdocs”;

第三個問題

问题解决后,当设置以下重写规则时,问题1和问题2类似,文档根目录会变成Apache的默认文档根目录(/var/www/html)。

RewriteEngine on
RewriteRule ^(/|/index.php)$ /hoge/test.php

导致这个情况的原因是什么?

如果将目录指令放在外面进行描述,那么重写目标就会查看Apache的默认文档根目录(/var/www/html)。

解决办法

通过将Rewrite放入Directory指令内解决了该问题。

最终的VirtualHost配置内容

<VirtualHost *:80>
    VirtualDocumentRoot /var/www/vhosts/%0/httpdocs
    php_admin_value auto_prepend_file /etc/httpd/conf/vhosts/example_document_root.php   #←サーバ変数書き換え
    ServerName   example.jp
    ServerAlias  www.example.jp
    ErrorLog /var/log/httpd/example.jp_error_log
    LogLevel warn
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %v" combined
    CustomLog /var/log/httpd/example.jp_access_log "combined"
    <Directory /var/www/vhosts/example.jp/httpdocs/>
        AllowOverride All
        DirectoryIndex index.php index.html index.htm

        RewriteEngine on    #←RewriteはDirectoryディレクティブの中で記述する
        RewriteRule ^(/|/index.php)$ /hoge/test.php
    </Directory>
</VirtualHost>
广告
将在 10 秒后关闭
bannerAds