ホーム > Linux > PHP + Apache2でMultiViewsを設定する方法

PHP + Apache2でMultiViewsを設定する方法

apache_server.jpg

先日、お知らせメールApache2とPHPの組み合わせに、MultiViewsを設定しました。
そうすると、Yahoo! Site Explorerの認証時に”406 Not Acceptable“のエラーが返されてしまいました。

どうやら、PHPファイルのMIMEタイプの設定が悪かったようです。
今回はメモ書き程度に、この設定方法をまとめます。

MultiViewsとは

そもそも、MultiViewsとは何でしょうか。

リソースをネゴシエーションするためには、 サーバは variant それぞれについての情報を知っておく必要があります。 これは以下の二つの方法のどちらかで行われます。
タイプマップ (すなわち *.var ファイル) を使う方法。 これは variant を明示的に挙げているファイルを指定します。
‘Multiviews’ を使って、サーバが暗黙の内にファイル名にパターン照合を 行なってその結果から選択する方法。

コンテントネゴシエーション – Apache HTTPサーバより

これにある通り、”複数あるファイルの選択肢から、クライアント側のHTTPヘッダ情報を元に送り返すファイルをApache2に選ばせる“機能です。
mod_negotiationというApacheモジュールに含まれています。

クライアント、よく使うのはFirefoxやSafariのWebブラウザですね。
このWebブラウザはサーバに対してHTTPヘッダを送信しています。

sending_http_header.png

サーバはこのHTTPヘッダを読み、その上で適切なファイルを選び、クライアントに送り返します。

receiving_http_header.png

これを使って何が出来るか、というと.php拡張子がついたPHPファイルに拡張子なしのURLでアクセス出来ます。

Apache2での設定

まず、MultiViewsを設定します。
Optionsディレクティブに+MultiViewsを指定するだけです。

<Directory /var/www/>
  Options -Indexes FollowSymLinks +MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
</Directory>

Options All“だとMultiViewsがオンにならないため、注意が必要です。

次にPHP側の設定です。
設定方法はPHPのドキュメントに書いてあります。

デフォルトでは、PHPファイルのMIMEタイプは以下のように”application/x-httpd-php“に設定されています(設定ファイルはdebian系ならmods-available/php5.confに、RedHat系ならconf.d/php5.confにあります)。

<IfModule mod_php5.c>
  AddType application/x-httpd-php .php .phtml .php3
  AddType application/x-httpd-php-source .phps
</IfModule>

これを以下のように変更します。

<IfModule mod_php5.c>
  AddHandler php5-script php
  AddType text/html php
</IfModule>

これだけです。
これだけでPHPファイルに対して、MultiViewsが有効になります。
もちろん、”406 Not Acceptable“も発生しません。

ただし、この方法はApache 1.xだとうまく動かないようです。
詳しくは公式サイトを。

406 Not Acceptable

なぜ、デフォルトの設定だとYahoo! Site Explorerクローラを通さないのでしょうか
それは”クライアントが送ってきたHTTPヘッダを元に送り返すファイルを決定する“というMultiViewsの性質のせいだと思います。

デフォルト設定におけるPHPのMIMEタイプは”application/x-httpd-php“です。
このMIMEタイプだとクライアントがAcceptフィールドとして”text/html“だけを送ってきた場合に、サーバが適切なファイルとしてPHPファイルを選択出来ません
その結果が”406 Not Acceptable“です。

not_acceptable.png

これをPHPファイルが”html/text“だと指定してやることで、クライアントがAppectフィールドとして”text/html“を送ってきた場合に、サーバがPHPファイルを選択出来るようになります

html.png

簡単な説明ですが、理解出来たでしょうか?
そもそも、この説明が間違っている可能性もあるのですが…。

ちょっとサーバ周りで問題が出たので調べてまとめてみました。
間違いがある場合はご指摘ください。

ちょっと一言

前の記事のPVが伸びていてびっくりしてます。
大したこと書いてないんだけどな...。
あとここまで伸びたら、ちゃんとやらなきゃいけないじゃないかw
ま、マイペースに頑張りましょう!まずは"初めてのPython"の書評を書きますね。

  • http://topsy.com/1-byte.jp/2010/09/18/multi_views_for_php_and_apach2/?utm_source=pingback&utm_campaign=L2 Tweets that mention PHP + Apache2でMultiViewsを設定する方法 — Topsy.com

    [...] This post was mentioned on Twitter by apache_info_bot, tfmagician(FUJIWARA) and apache_info_bot, tfmagician(FUJIWARA). tfmagician(FUJIWARA) said: ブログ更新しました!: PHP + Apache2でMultiViewsを設定する方法 http://1-byte.jp/2010/0 [...]

blog comments powered by Disqus

ホーム > Linux > PHP + Apache2でMultiViewsを設定する方法

スポンサードリンク
書いている人
つぶやき
RSS 気になるニュース
過去の記事

ページの上部に戻る