在使用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>