直接的に .htaccess
側から $_SERVER
の既存の値を上書きすることはできないと思いますが、間接的に上書きする方法は考えられます。
$ cat .htaccess
php_flag display_errors on
php_value auto_prepend_file config.php
$ cat config.php
<?php
$_SERVER['DOCUMENT_ROOT'] .= '/test';
test
ディレクトリ内の .htaccess
で php_value auto_prepend_file
を記述して、test
ディレクトリ内の php にアクセスした際に config.php
(ファイル名は任意)を読み込むようにします。
test
ディレクトリ内に config.php
を設置し、$_SERVER['DOCUMENT_ROOT']
にサブディレクトリにパスを追加して変数の値を上書きします。
本来はこういう方法を採らなくても済むように、$_SERVER
値などは直接参照せず、ユーティリティクラスメソッドなどを経由して取得するようにして、デバッグ環境での変数のオーバーライトなどが容易にできるように設計するほうが好ましいかもしれません。例えば Util::$_SERVER
の値が設定されていればその値を、設定されていなければ $_SERVER
を参照するといった具合です。
追記
今回の質問もhtml内に<?php include($_SERVER['DOCUMENT_ROOT']."/include/header.html");?>のコードを書いています。
本来はこういう方法を採らなくても済むように〜の部分をもう少し掘り下げて教えていただけないでしょうか・・・
今回のように多少ややこしいことをやりたい場合は、予めややこしいことができるような設計に基づいた実装をすべきだということです。
・.htaccessから間接的に上書きする方法はよろしくないのでしょうか?それに比べてユーティリティクラスを使うメリットはありますでしょうか?(速度など?)
自動生成される $_SERVER['DOCUMENT_ROOT']
の値を変更する(捻じ曲げる)というのはバグの温床にもなり本来は推奨されない方法です。
ただし、今回のように test 環境で設定値を変更したいような、一時的でその場しのぎをしたい場合であれば、$_SERVER['DOCUMENT_ROOT']
の値を変更してしまう方法でもまあ良いのではないでしょうか。
・例えば Util::$_SERVER の値が設定されていればその値を〜のところをもう少し具体的に教えていただけないでしょうか。(.phpファイルを置いてrequire_onceとかで読み込み?
クラスやヘルパー関数のファイルやを用意する場合は、使う側で require_once
などで読み込みます。実際のサイトのファイル構成などが分かりませんが、ページ数が大量にあってディレクトリ階層も異なるような場合は「Front Controller パターン」で実装することが多いと思います。動的な処理は Front Controller のファイルに任せて、ページごとに異なるHTMLソースコードは View として持っておくというものです。MVCパターンの簡易的な実装です。この説明が何を言っているのか意味がわからなければ MVC パターンについて調べてみてください。
ユーティリティクラスで云々というのも、ページ数が多い場合は Front Controller パターンでの実装を前提としたものになるため(そうでなければ、各ページファイルでそれぞれ Util を読み込む必要が出てしまう)、いきなり Util クラスでの実装例を説明してもしょうがない気がしますが、一応書いておきます。
before
php
1<?php include($_SERVER['DOCUMENT_ROOT']."/include/header.html");?>
2
3<?php include($_SERVER['DOCUMENT_ROOT']."/include/footer.html");?>
after
php
1class Util {
2 public static $_SERVER = [];
3
4 public static function getServerParam($key) {
5 return array_key_exists($key, self::$_SERVER) ? self::$_SERVER[$key] : $_SERVER[$key];
6 }
7
8 public static function includePartial($file) {
9 $includeFilePath = sprintf('%s/include/%s', self::getServerParam('DOCUMENT_ROOT'), $file);
10 include($includeFilePath);
11 }
12}
php
1<?php require_once(__DIR__.'/Util.php'); // Util.php への正しいパスを書く ?>
2<?php includePartial('header.html'); ?>
3
4<?php includePartial('footer.html'); ?>
test ディレクトリ以下の場合
php
1class Util {
2 public static $_SERVER = [
3 'DOCUMENT_ROOT' => 'ここに書き換え後のパスを書く',
4 ];
5
6 public static function getServerParam($key) {
7 return array_key_exists($key, self::$_SERVER) ? self::$_SERVER[$key] : $_SERVER[$key];
8 }
9
10 public static function includePartial($file) {
11 $includeFilePath = sprintf('%s/include/%s', self::getServerParam('DOCUMENT_ROOT'), $file);
12 include($includeFilePath);
13 }
14}
とするなり、Util::getServerParam()
の実装を変えて .htaccess
からのカスタムパラメータを受け付けるようにするなりすれば php_value auto_prepend_file
を書くようなことをしなくても済むということです。