質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

Q&A

解決済

1回答

3294閲覧

phpインクルードで取得するドキュメントルートのパスを.htaccessで変更したい

suzienuzie

総合スコア2

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

0グッド

0クリップ

投稿2022/03/28 06:14

htmlの共通ファイルをphpインクルードで読み込んで運用しています。

<?php include($_SERVER['DOCUMENT_ROOT']."/include/header.html");?> <?php include($_SERVER['DOCUMENT_ROOT']."/include/footer.html");?>

.htaccessでサブディレクトリをルートディレクトリに変更は可能でしょうか。

テストディレクトリは/test/をルートディレクトリにしたく、上記の質問を参考にルートディレクトリのパスを変更しました。
htmlやcssのパスはうまく変更されたのですが、phpインクルードだけは元の/がルートのままになっています。
$_SERVER['DOCUMENT_ROOT']も/test/をルートとしたいです。

.htaccessとphpの読み込み(実行)の順番などは制御できるのでしょうか?
一括で変更できるのであれば.htaccessを使ったやり方でなくても良いです。
詳しい方、ご教示いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arcxor

2022/03/28 06:45

> $_SERVER['DOCUMENT_ROOT']も/test/をルートとしたいです。 これは何故ですか? setEnv で APPLICATION_ROOT などと独自の変数を定義するのでは駄目なのでしょうか。あるいは、独自のユーティリティクラスなどを用意して getDocumentRoot() などとメソッドを自作するのでは駄目なのでしょうか。 この質問の意図をもう少し教えていただけませんか。
suzienuzie

2022/03/28 06:54

ご質問ありがとうございます。 なぜこうしたいのかというと、先に書いたとおりhtmlの共通部分をphpインクルードで読み込むようにしており、テストアップする際の手間を省きたいが為です。 testディレクトリの中身は本番のルートディレクトリと同じ構造になっており、testディレクトリにアップ→自動的にtestをルートとした内容になればいちいちパスを修正したりする必要がないため効率化できるかと考えました。
suzienuzie

2022/03/28 07:58

arcxor様 ご回答ありがとうございます! 当方phpはWordpressのカスタマイズでhtml内に記述する程度で、あまり詳しくなく、ご回答いただいた内容も良く理解できておりません・・・ 今回の質問もhtml内に<?php include($_SERVER['DOCUMENT_ROOT']."/include/header.html");?>のコードを書いています。 本来はこういう方法を採らなくても済むように〜の部分をもう少し掘り下げて教えていただけないでしょうか・・・ ・.htaccessから間接的に上書きする方法はよろしくないのでしょうか?それに比べてユーティリティクラスを使うメリットはありますでしょうか?(速度など?) ・例えば Util::$_SERVER の値が設定されていればその値を〜のところをもう少し具体的に教えていただけないでしょうか。(.phpファイルを置いてrequire_onceとかで読み込み?
guest

回答1

0

ベストアンサー

直接的に .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 ディレクトリ内の .htaccessphp_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 を書くようなことをしなくても済むということです。

投稿2022/03/28 07:17

編集2022/03/28 09:26
arcxor

総合スコア2857

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzienuzie

2022/03/29 02:18

再度のご回答本当にありがとうございます!大変勉強になりました。 MVCパターンについても調べてみました。Webアプリの設計思想的な感じですかね? 多分今回私がやりたかったことについてここまでやるのはコストがかかりすぎるかなと思うので、その場凌ぎで教えていただいた方でやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問