htmlファイルでphpを動かす 〜httpd.confの設定〜

#事前背景

今回は、ヘッダーやフッターなどをパーツ化したり、共通項をphp化したものをブラウザで表示することに加え、さらにseo的にも有利になるように(少なくても不利にならないように)どうすれば良いかを考え調べた内容です。

題目の通り、『.html』ファイルでphpを動かす設定をしただけですが、関連知識や調べた事をまとめてみました。

最後に『.htaccess』に書かかない理由についても触れてますが、基本は、アパッチの設定ファイル『/etc/httpd/conf/httpd.conf』等に書くことを想定してます。

##開発環境

php 7.0.13
Apache 2.4.6
CentOS 7.2.1511
Vagrant 1.8.1

※フレームワークは使いません

#『.html』のファイル内でphpを動かす

httpd.conf内に下記を追加することで可能になります。

```/etc/httpd/conf/httpd.conf
<IfModule mime_module>
   AddType application/x-httpd-php .html
</IfModule>
```

`<IfModule mime_module>`内の一番下に設定することで、
今回は、『.html』ファイルに書かれているphpを動かすことに成功しました。

調べたところ、`<IfModule mime_module>`では、CGIやPHPなどを、それぞれのプログラムのスクリプトである事を宣言できるみたいです。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1015230420
http://www.ahref.org/tech/server/apacche/256.html

##影響点について考える

続いて、htmlでphpを動かすことのメリットデメリット等など影響について考えてみました。

###メリット

1. htmlとしてブラウザで表示する事により、phpが書かれていることが隠蔽でき る。phpが動いていることを意識させない
2. htmlファイルのためseo対策になる(phpでも今は変わらなそうだけど、不利に転ぶことはなさそう)

###デメリット

1. サーバーの負担がかかる？(しかし、htmlでもファイルでも中身がphpならそんなに変わらないような気もします)
2. 開発者以外がコードを見たときに、ファイル名だけでは、何が書かれているか判別できない

考えた結果、チーム開発でなければ、大きなデメリットもないように感じたため『.html』として表示させることを採択しました。

#拡張子なしでもアクセス可能にすること

拡張子なしでもアクセス出来た方が良いのかどうかを考えました。が、その場合seo的に、index.html と index の二つアクセス出来てしまうし、混在することになるのではという懸念も生まれました。

##成功例

```
<directory 対象のパス>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php
</directory>
```

これで、indexもindex.phpもアクセス出来るようになります。
htmlファイルも同じようにすればいけると思います。
ただ、indexもindex.phpもアクセスできてしまうため
seo的にもどうなのなという懸念点が残ります。のでさらに加えて拡張子付きのアクセスを防ぐ設定をすることで懸念点がクリアされる可能性はあるも今回は未確認

##失敗例

下記の二つの方法だとパッとやった感じ上手くいきませんでした。

```
<directory>
    Options MultiViews
    Options All
</directory>
```

```
<directory>
    AllowOverride AuthConfig FileInfo Indexes Limit Options=All,MultiViews
</directory>
```

http://d.hatena.ne.jp/ymd_mkhk/20110721/1311255903

###MultiViewsについて

例として、サーバが /sample/file へのリクエストを受け取ったときに、/sample/fileが存在しない場合、ディレクトリ内のfile.* にあてはまる全てのファイルを探し、表示するようです。
/sample/file.html や/sample/file.php などを探します。
このため、拡張子なしでもアクセス出来るようになる仕組みみたいです。

https://httpd.apache.org/docs/2.4/ja/mod/mod_negotiation.html

##余談として

※今回はフレームワーク等を使用しない設定になります。
cakephpだと、ルーティングかどこかの設定で、表示もアクセスも拡張子なしのファイル名一択で行われていますね。

# / (スラ) で index.html や index.php　のファイルを読み込む

下記の設定によりURL省略時にアクセスするファイルを追加できます。

```
<IfModule dir_module>
    DirectoryIndex index.html index.htm index.php index.cgi
</IfModule>
```

しかしそもそもデフォルトで効いていた(ブラウザで、ファイル名を入れなくても、デフォでindexファイルが読み込まれるようになっていた)ため、今回は未確認。

# .htaccess を使用しない理由

私もかつて、『.htaccess』 で、.html としてphpを読ませたり、拡張子を隠したりの設定をしていましたが、
必ずしも『.htaccess』を使う必要がないことが分かりました。
どちらかというと使わないほうがいいという結論です。

##AllowOverride all があって初めて有効になる

アパッチのhttpd.confファイルの中で、
`AllowOverride all`
がないといくら.htaccessに書いても、その設定が有効にならないことがわかりました。

##『.htaccess』が非推奨な理由

さらに調べると、.htaccessでできることはすべてconfファイルでできることが分かりました。
つまり、confファイルをいじれる権限さえあれば、.htaccessを作成する必要がないのです。
それどころかサーバーの負担増加やパフォーマンスの低下に加えセキュリティの観点からみてもデメリットばかりで、非推奨であることもわかりました。

https://httpd.apache.org/docs/2.2/ja/howto/htaccess.html

htmlファイルでphpを使うということを、グーグルで検索すると、.htaccessの設定で対処する記事ばかりでした。
これは、レンタルサーバーなどで、root権限がなく、httpd.confをいじることが出来ない状況の方が多かったためだと思います。
気づきませんでした。

#結論

結論として、安全策を選びました
・httpd.confに追記 (.htaccessは使わない)
・ブラウザ上の表示は .html のみ
・拡張子の省略によるアクセスは許可しない設定。
・htmlで、phpを動かせるように設定

seo的に、仮に影響が出ても他の設定等をこなすことでカバーできる対策もあったかもしれないが一応現状のベストな状態として記します。

何か諸意見、アドバイス等ありましたら、気軽にコメント頂けましたら幸いです。