Home> Internet >  MovableType >  ダイナミックパブリッシングで、複数ブログ利用でのパスが同じ時

ダイナミックパブリッシングで、複数ブログ利用でのパスが同じ時

チョット5月はいろんなことがありまして、まぁその件はいずれやるとして、久しぶりに記事書きます。

商用サイトを作るときなどに、複数ブログを扱うことがあると思いますが、諸々の事情で(例えば、日英のコンテンツを別なパスに公開する必要があるとか)ブログの公開パスが同じ物が存在するということは、良くあると思います。

  • ウェブサイト(http://www.hoge.com/)
    • ウェブサイトの日本語ウェブページ(http://www.hoge.com/・・・)
    • ウェブサイトの英語ウェブページ(http://www.hoge.com/en/・・・)
    • ブログ1(http://www.hoge.com/)
      • ブログ1の日本語アーカイブ(http://www.hoge.com/blog1/・・・)
      • ブログ1の英語アーカイブ(http://www.hoge.com/en/blog1/・・・)
    • ブログ2(http://www.hoge.com/)
      • ブログ2の日本語アーカイブ(http://www.hoge.com/blog2/・・・)
      • ブログ2の英語アーカイブ(http://www.hoge.com/en/blog2/・・・)

この様な場合に、それぞれのブログでダイナミックパブリッシングを利用しようとすると、うまく行かなくなるケースがあります。 その原因と、対応方法について説明します。

ダイナミックパブリッシングの簡略化した仕組み

動作には2つのファイルが関連してます。「.htaccess」と「mtview.php」です。

## %%%%%%% Movable Type generated this part; don't remove this line! %%%%%%%
# Disable fancy indexes, so mtview.php gets a chance...
Options -Indexes +SymLinksIfOwnerMatch
  <IfModule mod_rewrite.c>
  # The mod_rewrite solution is the preferred way to invoke
  # dynamic pages, because of its flexibility.

  # Add mtview.php to the list of DirectoryIndex options, listing it last,
  # so it is invoked only if the common choices aren't present...
  <IfModule mod_dir.c>
    DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /test/mtview.php
  </IfModule>

  RewriteEngine on

  # don't serve mtview.php if the request is for a real directory
  # (allows the DirectoryIndex lookup to function)
  RewriteCond %{REQUEST_FILENAME} !-d

  # don't serve mtview.php if the request is for a real file
  # (allows the actual file to be served)
  RewriteCond %{REQUEST_FILENAME} !-f
  # anything else is handed to mtview.php for resolution
  # passthrough query parameters
  RewriteRule ^(.*)(\?.*)?$ /test/mtview.php$2 [L,QSA]
</IfModule>

<IfModule !mod_rewrite.c>
  # if mod_rewrite is unavailable, we forward any missing page
  # or unresolved directory index requests to mtview
  # if mtview.php can resolve the request, it returns a 200
  # result code which prevents any 4xx error code from going
  # to the server's access logs. However, an error will be
  # reported in the error log file. If this is your only choice,
  # and you want to suppress these messages, adding a "LogLevel crit"
  # directive within your VirtualHost or root configuration for
  # Apache will turn them off.
  ErrorDocument 404 /test/mtview.php
  ErrorDocument 403 /test/mtview.php
</IfModule>
## ******* Movable Type generated this part; don't remove this line! *******

ダイナミックパブリッシングを利用するようにした場合、ブログルート(この例ではブログの公開パスは/test/です。)のこんな感じの内容の「.htaccess」が書き出されてると思います。いっぱい書いてあるように見えますが、大半がコメントとフェイルセーフのための内容です。 Apacheでmod_rewriteとmod_dirが有効の場合、意味を持つのは、次の6行だけです。

Options -Indexes +SymLinksIfOwnerMatch
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /test/mtview.php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)(\?.*)?$ /test/mtview.php$2 [L,QSA]

3行目でリライト処理を有効にし、4・5行目でファイルが存在しない場合のみ処理を限定し、6行目でクエリを引き継ぎながら処理をmtview.phpに渡しています。

<?php
    include('/usr/local/httpd/cgi-bin/MT/php/mt.php');
    $mt = MT::get_instance(90, '/usr/local/httpd/cgi-bin/MT/mt-config.cgi');
    $mt->view();
?>

「mtview.php」も同じくブログルートにこの様な内容で書き出されていると思いますが、この中で注意するのは、MT::get_instanceの最初の因数の「90」の部分です。これはこのブログのブログIDになります。 ここからは、このブログIDを頼りに、MTが管理している(バーチャルな)ファイルかを判断(実ファイルを持たないアーカイブパスも「mt_fileinfo」のテーブルに保存されてます)して、コンテクストに応じた処理を返すようになっています。

パスが同じブログが複数ある場合の問題と対応

ここまで読めば、気づいたと思いますが、このブログIDを元に判断するというのがキモで、その為、複数ブログが同じ公開パスを持っていた場合、それぞれのブログから「mtview.php」が書き出され、ファイルが存在するか判断する為のブログIDが、正しく与えられずにダイナミックパブリッシングの処理としてエラーになります。

この問題を解決するには、適切なブログIDをそれぞれ対象ごとに渡すようにする事が必要です。

異なる階層にそれぞれを設置する場合

最初に上げた例のような構造の場合は、公開パスは一緒でも、実際にファイルを書き出すパスは、それぞれ違っているので、各階層に「.htaccess」と「mtview.php」を置いてやれば解決します。mtview.phpの中で、それぞれ対応するブログIDを指定すれば解決です。

同一階層で処理を分ける場合

あまりないとは思いますが、複数ブログで権限を持つユーザーが異なり、それぞれが管理するウェブページがルートに書き出される場合、「.htaccess」をそれぞれで設置は出来なくなります。その要な場合は「mtview.php」はリネームしても動作するので、「mtview1.php」と「mtview2.php」を用意してそれぞれに対応するブログIDを書き、以下の様な「.htaccess」で振り分け処理をすれば大丈夫です。「file1.html」は「mtview1.php」で、「file2.html」は「mtview2.php」でそれぞれ処理されます。どちらにも合致しないファイルリクエストは、「mtview.php」で処理されます。

Options -Indexes +SymLinksIfOwnerMatch
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /test/mtview.php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(file1\.html)(\?.*)?$ /mtview1.php$2 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(file2\.html)(\?.*)?$ /mtview2.php$2 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)(\?.*)?$ /mtview.php$2 [L,QSA]

おまけ

リクエストのエラーページをApacheで設定している場合でも、ダイナミックパブリッシングが有効なパス以下では、ダイナミックパブリッシングのエラーページが表示されます(システムテンプレートの「ダイナミックパブリッシングエラー」の内容)。存在しない全てのファイルのリクエストをダイナミック・パブリッシングが処理するからです。

対象とするパスが明確な場合は、特定のリクエストのみダイナミック・パブリッシングが有効になるように「.htaccess」を書いたほうがリクエストに対する反応時間や、ダイナミックパブリッシングの起動時間(ファイルがないことを返すまでに時間)を節約できます。例えばブログ記事(標準のアーカイブマップ)のみをダイナミック・パブリッシングの対象にする場合は、以下のようにすれば、でたらめなリクエストを投げられた時のエラー表示までの時間が短縮されます。

Options -Indexes +SymLinksIfOwnerMatch
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /test/mtview.php
RewriteEngine on
RewriteRule ^\d{4}/\d{2}/(.*)(\?.*)?$ /mtview.php$2 [L,QSA]

DynamicMTMLの場合も基本的な考え方は一緒ですが、「.htaccess」と「.mtview.php(DynamicMTMLの場合はmtview.phpではない)」の内容が、もう少し複雑になるので書き換えに注意が必要です。

Comment:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://www.zelazny.mydns.jp/cgi-bin/MT/mt-tb.cgi/2360

Home> Internet >  MovableType >  ダイナミックパブリッシングで、複数ブログ利用でのパスが同じ時

CC Licence

Creative Commons License

このブログはクリエイティブ・コモンズでライセンスされています。

Feeds

Return to page top