よく「CGI や PHP は SEO に不利だ!」なんてことが言われますが、これは技術的なことをよく理解していない人に向けて、難しいことを極端に省略した説明なので、大きな誤解を孕んでいます。
正確には、
http://www.abe-tatsuya.com/aaa.cgi?v1=bbb&v2=ccc
のようなURIの、CGI や PHP に値を GET メソッドで渡す「?v1=bbb&v2=ccc」といった部分が問題なわけです。
こういった値を渡さない、シンプルな URI であれば、拡張子が何であろうが関係はないはずです。
なので、逆に CGI や PHP でなく、拡張子が .html であっても、
http://www.abe-tatsuya.com/aaa.html?v1=bbb&v2=ccc
のような URI なら、同様に検索エンジン側から「これは動的なURIだ」と判断されて、低く評価されるはずです。
(アクセス解析目的とか、ページ側で JavaScript 等で何かの処理をする際に、こういう手法を取ることはあり得ますよね)
で、そういった CGI や PHP 等に、GET メソッドで値を渡した結果によって表示する内容を変えるようなコンテンツの場合、検索エンジンから低く評価されることを避けるために、下記のような URI で処理することが多いです。
http://www.abe-tatsuya.com/aaa/bbb/ccc
最初の例との違いは、以下の通りです。
- 「aaa.cgi」の拡張子「.cgi」がない
- 「ここからが GET メソッドで渡す値ですよ」という意味の記号「?」がなく、代わりに「/」で区切っている
- GET メソッドで渡す値の名前(「v1=」「v2=」)がない
- GET メソッドで渡す値の区切りの記号「&」がなく、代わりに「/」で区切っている
これで、一見して動的な URI ではなく、単なるディレクトリ内にあるファイルの URI のように見せることができるわけです。
これを実現するためにやらないといけないことは、
- 「aaa」という拡張子のないファイルが、CGI または PHP のスクリプトであることをサーバーに教えてあげる
- 「aaa」のスクリプト内で、「/」区切りで渡される値を受け付ける処理を書く
大きく分けて、この二点です。
拡張子のないファイルを CGI や PHP として動作させる方法
「aaa」のような拡張子のないファイルを、CGI または PHP として動作させるには、.htaccess を使います。
特定のファイルに対するアクセス制限や、.htaccess で特定のファイルのみにBasic認証を設定する方法の応用で、
<Files aaa>
ForceType cgi-script
</Files>
と書けば、「aaa」というファイルが CGI として実行されます。
PHP として実行したい場合は、
<Files aaa>
ForceType application/x-httpd-php
</Files>
と書けば、「aaa」というファイルが PHP として実行されます。
perl の CGI や PHP で、「/」(スラッシュ)で区切られた値を受け取る方法
とりあえず「aaa」のようなファイル名のスクリプトが動くようになりました。
次は「/bbb/ccc」のような、一見ただのディレクトリへのリクエストのように見える URI を、スクリプトに渡される値として処理するための方法です。
これには、環境変数 PATH_INFO を参照します。
例えば、perl の CGI である「http://www.abe-tatsuya.com/aaa」に対して、「/bbb/ccc」という値を渡す、つまり、「http://www.abe-tatsuya.com/aaa/bbb/ccc」という URI にアクセスさせる場合、「aaa」というスクリプトの中で、$ENV{'PATH_INFO'}を参照すると、その内容は「/bbb/ccc」となります。
なので例えば、「aaa」という CGI スクリプトの最初のほうに、
#-- PATH_INFO を「/」で分けて配列に格納
@params = split(/\//,$ENV{'PATH_INFO'});
shift(@params);
等とすれば、$params[0],$params[1]... の順番に、「/」区切りで渡された値が入ります。
PHP の場合は、$_SERVER['PATH_INFO']を参照すれば、同様に処理できます。
// PATH_INFO を「/」で分けて配列に格納
$params = split("/",$_SERVER['PATH_INFO']);
array_shift($params);
これで、perl と同様に、$params[0],$params[1]...の順番に、「/」区切りで渡された値が入ります。
後は、渡された値に応じて、出力内容を変えるように色々とスクリプトを書けば OK です。