カテゴリー別アーカイブ: ディレクトリ構成

サブドメイン設定とシンボリックリンクの作成

前の投稿の続きになります。

サイトAにサブドメインを追加することが決まったので、優等生アプリケーションcPanelを使って設定します。cPanelのDomainsのボックスにSubdomainsがあるのでクリック、サブドメイン設定のページに遷移するので、テキストフィールドにサブドメイン名とサブドメインのドキュメントルートを入力して終わりです。ドキュメントルートとは、サブドメインhttp://××.○○○.com/にアクセスされた時に開くディレクトリのことで、今回サイトAのサブドメインhttp://en.○○○.com/のルートにはhttp://www.○○○.com/enというディレクトリを作り指定しました。

さて、前回のエントリで書きました通り、サブドメイン設定後にある問題にぶちあたりました。サイトAではサイトに共通のスタイルシートをhttp://www.○○○.com/cssにまとめて置いていたのですが、http://en.○○○.com/以下のファイルから相対パス指定でアクセスしようとすると、not foundになってしまうのです。サブドメインのドキュメントルートをhttp://www.○○○.com/enにしているわけですから、cssディレクトリ中の例えばsample.cssというファイルにアクセスするには、相対パスで”../css/sample.css”と指定すれば良いと思っていました。しかしエラー表示を見ると、要求したアドレスの頭がhttp://en.○○○.com/になっています。つまり、サブドメインを作成してしまうとそのアドレスのドキュメントルートにどのデイレクトリを指定しているかに関わりなく、アドレス要求の頭がサブドメインになってしまいそれ以上遡れないようになるのです。

調べてみると、この問題を解決するための考え方には以下の3通りがあるようです。

  • ディレクトリ構成を再考する
  • ファイル指定は常に絶対パスで行う
  • サーバのOSであるUNIXのファイルシステム上で設定をいじる

まず一番上のディレクトリ構成の再考ですが、簡単に言うと大前提である一箇所に纏められたcssファイルの使用をあきらめるということになります。サブドメインに個別のcssデイレクトリをつくって、一部の共通スタイルシートは重複して存在させるようにします。この方法であればサブドメインから遡れない箇所にあるファイルにアクセスしなくて済みます。ただ、当然ながら片方のcssファイルに加えた変更はもう片方に反映されないため、サイト全体に関わるスタイルの変更を行う時には、共通ファイルに複数の版が存在してしまわないよう気をつけなければなりません。

次に、絶対パスの使用です。簡単に言うと相対パスを使わず、ファイルを呼び出す時は必ずhttp://から始まるアドレスを入力するという方法です。PHPなどのスクリプト言語が使用できる環境なら、http://www.○○○.com/の部分を定数として定義、cssファイルなどが呼び出されるときに文字列連結するようにすれば、将来的にドメインを移行することになっても修正箇所が少なくて済みます。

最後のひとつ、UNIXファイルシステムの機能を使う方法は、windowsのショートカット、MacOSのエイリアスにあたるシンボリックリンクを使う方法です。今回の解決法にはこれを採用しました。

とは言えUNIXコマンドの知識は皆無だったので、webで調べながらコマンドを打つ方法では操作を間違えてしまった時に何が起こるのか予想もつかないということで、もう少し簡単で安全な方法を探しました(本当はcPanelに標準でついていてほしい機能だったのですが)。すると、どうやらPHP4以降のバージョンにはシンボリックリンク作成のためのsymlinkという関数が搭載されているようです。

symlink関数は、symlink(引数1,引数2)という書式をもち、引数1にはリンク先(上の例でいうならhttp://www.○○○.com/以下のcssデイレクトリ)、引数2には新しく用意するパスを与えます。ただこの際に行うのはあくまでサーバのUNIXファイルシステムに対する操作なので、http://から始まるパスではなく、サーバから提供されたドキュメントルートのパスを与えてやらなければなりません。このサイトAの場合には、/home/ユーザ名/public_html/がドキュメントルート(http://www.○○○.com/でアクセスできる場所)として与えられていたので、symlink(/home/ユーザ名/public_html/css,/home/ユーザ名/public_html/en/css);という命令を実行してシンボリックリンクを作成しました。

さて、こうしたシンボリックリンクを作成の度に手打ちでphpファイルを修正、ブラウザからアクセスという手順を踏むのは面倒です。そこでフォームから与えられたパスでリンクを作ってくれるphpファイルを作成しました(右クリックメニューからからダウンロードを選択してください。あと圧縮ファイルなので実行時には解凍してください)。

Symlinkcreator.rar(2012.6追記:配布終了しました。代わりにソースコードを書き連ねておきます。)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>tool_symlink</title>
</head>
<body>
<p><strong>Create a symboliclink of selected file/directory.</strong></p>
<p>Paths like /home/username/public_html/... are required.</p>
<form action="tool_symlink.php" method="post">
<p>Original to a link : <input type="text" name="linkoriginal" /></p>
<p>Jump from this new path : <input type="text" name="jumpfrom" /></p>
<p><input type="submit" value="create" /></p></form>
<?php
if(!empty($_POST["linkoriginal"]) && !empty($_POST["jumpfrom"])){
if(file_exists($_POST["linkoriginal"])){
if(file_exists($_POST["jumpfrom"])){
echo "ERROR : The name you entered for symboliclink is already used.<br /> ";
}
else{ 
symlink($_POST["linkoriginal"],$_POST["jumpfrom"]);
echo "Symbolic link <strong>".$_POST["jumpfrom"]."</strong> to <strong>".$_POST["linkoriginal"]."</strong> is now available.";
}
}
else{
echo "ERROR : The file/directory you have requested as original is not found.";
}
}
?>
</body>
</html>

ちなみにセキュリティ対策は何も行っていないプログラムなので、外部からアクセスできないデイレクトリに置いて使う必要があります。あとこのプログラムによって引き起こされた損害に対して作者は責任を負いません。実際簡単なプログラムなので、無許可で改変して実用化してもらえればと思います。

解決法に辿り着くまで、それから実際にプログラムを完成させるまでかかった時間を、同じ問題にぶつかった人がこれで短縮できればと思っています。


サイトAにサブドメインを設定するべきか

サイトを巡回していると、http://www.○○○.com/××といったwwwから始まるページアドレスの他に、http://××.○○○.comのような任意の単語がドメインネームの前に置かれたアドレスのページをよく見かけます。例えばgoogleであれば、検索のトップページhttp://www.google.com/に対して、google docsのページはhttp://docs.google.com/、google mapsのページはhttp://maps.google.com/のように提供する機能の単語をドメインネームgoogle.comの前につけています。

これがサブドメインと言われるもので、ディレクトリへのパスをそのままページアドレスにする方法に対して有利な点がいくつかあります。具体的には、

  • 深い階層にあるデイレクトリに、短いアドレスでアクセスできる
  • 検索エンジンの検索結果として、1サブドメインにつき1件として扱ってくれる場合がある

一方で、検索エンジンの被リンク数をドメインの評価として加算していくアルゴリズムを考えると、サブドメイン毎に加算ポイントがばらけてしまう状態はSEO的なディスアドバンテージになります。このようにサブドメインでの運営は長所も短所もあるので、実際に導入する場合にはサイトの将来的なプランに沿う選択であるか考えてみる必要があります。

さて、サイトAの計画には、日本語ページの他に英語版のページをつくる予定がありました。この英語版ページにはサブドメインhttp://en.○○○.com/のようなアドレスを設定しましたが、それは以下のような理由によるものです。

  • 日本語版と英語版で提供する機能は違うものを想定している
  • 英語版のアドレスからサイトにやってきた人が、日本語のコンテンツに遭遇してしまうことを避けたい

つまりページの想定している客層が異なるので、不必要な導線は除いておく必要があったのです。例えば英語版を閲覧していた人が存在しないページのリクエストを送ってしまった場合、404エラーのページから自動的に戻る、あるいはアドレスを削って辿り着く先が日本語版ページのトップだと不安になってしまうのではないかと思うのです。

そういうわけで、サブドメインを設定するかどうかの問題は解決しましたが、設定時には予期せぬ落とし穴にハマってしまいました。サブドメイン設定時には気をつけなければならない問題なのですが、それは次のエントリにでも書こうと思います。