Movable Type 備忘録

 サブドメイン環境で Ajax やってみる

こんばんわ^^

一昨日、サブドメイン環境を作って Ajax のテストしてみました。
とりあえず、問題なく通信ができたようなのでご紹介します。

そもそも Ajax はドメインを跨った(クロスドメイン)通信ができません。
セキュリティ上の問題で http://AAA.bizcaz.com/ から http://bizcaz.com/ にあるファイルにアクセスすることができないんです。要するに同一ドメイン内での通信のみ可能ということになります。

で、わたしのサイトで配布してるテンプレートではブログ検索、コメント投稿など随所で Ajax を使用してます。
要するに以下のような環境の場合にはテンプレートは設置できても Ajax が使用できないため、コメント投稿などが機能しなくなってしまいます。

  1.  http://bizcaz.com/
  2.   |
  3.   +-- mt/
  4.  http://blog.bizcaz.com/
  5.   |
  6.   +-- index.php
  7.   |
  8.   +-- archives/
  9.   | +-- index.php
  10.   |
  11.   | +-- category/

http://bizcaz.com/(メイン) 側に Movable Type をインストールして、http://blog.bizcaz.com/(サブドメイン) 側にブログを設置するようなケースでは通常では Ajax は使用できないことになります。

以前からご連絡は頂いていたのですが、最近になってようやくクロスドメインの方法を教わって実際に試したところうまくいったので参考にしてください。

クロスドメインで Ajax を利用する方法

クロスドメインで Ajax を利用するには主に 2 つの方法があるようです。

  1. 中継プログラムを介して目的のファイルにアクセスする
    わたしはこの方法を教わって、中継プログラムを作って確認しました。
    中継プログラムとは、サブドメイン側のフォルダ内に CGI を置いて、JavaScript からその CGI を介して目的のファイルを読み出したり、実行したりします。
    その結果を受け取った中継プログラムが折り返し、JavaScript に返します。

  2. JSONP を使用する
    以前、占いランキングや天気予報表示の方法をご紹介したことがありました。

    drk7.jp さんとこで公開されてる XML を出力する URL にアクセスしてその結果を JOSON に変換するサービスを利用した JavaScript になります。

  3. 他に AJAX Cross Domain - ACD というサービスもあります。

主なやり方は上記 2 通りのようです。
今回わたしが実装したのは、1. の中継プログラムによる Ajax です。

中継プログラムについて

中継プログラムのコードを以下に記します。

  1.  #!/usr/bin/perl
  2.  use LWP::UserAgent;
  3.  my $mturl = 'http://●●●/mt/';
  4.  my $ua = LWP::UserAgent->new;
  5.  my $method = $ENV{'REQUEST_METHOD'};
  6.  my $url;
  7.  my $query;
  8.  if ($method eq "POST") {
  9.   read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
  10.   if ($query =~ m/switch=comment/) {
  11.   $url = $mturl . 'mt-comments.cgi';
  12.   }
  13.   else {
  14.   exit;# parameter error
  15.   }
  16.   our $req = HTTP::Request->new(POST => $url);
  17.   $req->content_type('application/x-www-form-urlencoded');
  18.   $req->content($query);
  19.  }
  20.  else {
  21.   $query = $ENV{'QUERY_STRING'};
  22.   if ($query =~ m/switch=search/) {
  23.   $url = $mturl . 'mt-search.cgi?' . $query;
  24.   }
  25.   else {
  26.   $query =~ s/\&/\?/;
  27.   $url = $query;
  28.   $url =~ tr/+/ /;
  29.   $url =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
  30.   }
  31.   our $req = HTTP::Request->new(GET => $url);
  32.  }
  33.  my $res = $ua->request($req);
  34.  print "Content-type: text/html charset=utf-8";
  35.  if ($res->is_success) {
  36.   print $res->as_string;
  37.  }
  38.  else {
  39.   print 'Request Error!!';
  40.  }
  41.  1;

上記コードは、Movable Type MEMO で配布するテンプレート専用の中継プログラムです。 汎用的には作ってません。

上記中継プログラムを適当なファイル名(たとえば、handling.cgi)で保存して、サブドメイン側にアップロードすれば利用可能になります。
JavaScript はこの中継プログラムに対してリクエストすることになります。

クロスドメインで Movable Type MEMO を利用する場合

サブドメイン対応したテンプレートセットはアップロード済みです。
以下の手順で各自の環境に合わせることでクロスドメインによる Ajax が利用できます。
※テンプレートセットがインストール済みで、テンプレートの適用を行っていることを前提として説明します。

  1. 中継プログラムを各自の環境に合わせます。
    圧縮ファイル中の mt_memo/js/prototype/handling.cgi をテキストエディタで開きます。 そして、以下の行を各自の環境に合わせて変更してください。

    • 5 行目
      各自の Movable Type のインストール先 URL に変更します。
    • 44 行目
      文字コードに UTF-8 以外を使用される場合には、Content-type の charset に Shift_JIS、または EUC-JP に変更します。
  2. 保存してサーバにアップロードします。
    保存する際、文字コードに注意してください。デフォルトでは UTF-8 で保存してます。それ以外の文字コードを使用されてる場合には、各自の環境に合わせて保存してください。
    また、アップロード先は mt_memo/js/prototype/ フォルダの中にアップロードします。

以上です。
変更後、再構築時に自動的に中継プログラムを使用するか否かを判断してますので、以降はあまり意識することなく使えると思います。

すべての人に役立つ内容ではないですが、クロスドメインで Ajax を利用する場合の参考にしていただければと思います。

 Trackback Pings(1)

from PAOLOG

おはようございます。 今週は連日招待状の宛名書きをしてます。書く前に一度練習し...

 Comments(0)

No comments found.

 Post a Comment

 

コメント用フィード