SEO(検索エンジン対策)

SEO としていますが、ここでの内容は URL に関しての話のみです。
以下は極論で、ここまで酷くはありませんが、検索エンジンは概ね次のように判断しています。

  1. URL が異なれば、別のコンテンツと見なす。
  2. ?以降のクエリ部分が異なっていても、 URL パス部分が同一であれば同じコンテンツと見なす。

それぞれの、Paraselene での対策方法を考えます。

異なる URL 対策

まず、Paraselene で問題となるのは1番です。Paraselene は以下のルールで URL を生成します。
lu.リクエストID.mo.遷移元ページ.on.遷移先ページ.na
遷移元と遷移先は毎回固定となりますが、リクエストIDはアクセスの度に別のものが発行されます。
このリクエストIDの付与 or 抑制を制御するために、Page クラスに isCheckRepeatSameRequest を持っています。
遷移先ページ(output が呼ばれる事になるページ)の isCheckRepeatSameRequest が true を返す場合に限り、その URL にリクエストIDが付与されます。
このメソッドの戻り値を true とすべきか false とすべきかは、以下のポリシーで考えると良いでしょう。

  • ログインして使用するコンテンツか否か?
    ログイン後のページには検索エンジンは侵入できませんので、そもそも SEO を考慮する必要はありません。リクエストIDの有無は関係ありません。
    ただし、セキュリティの観点からリクエストIDを付与した方が良いでしょう。
  • 一般に自由に閲覧可能なページであるか?
    自由に閲覧可能なページは検索エンジンのクロール対象になります。リクエストIDを抑制した方が良いでしょう。
  • 操作がクリティカルな画面か?(クリックで売買が成立する等)
    リクエストIDを付与し、二重実行回避を図った方が良いでしょう。
  • au端末用ページであるか?
    au はクエリを含め、 URL が以前開いたページと完全一致した場合、インターネットへアクセスせずに端末内のキャッシュを再表示します。
    サーバーは毎回のアクセスを期待している(クエリが同じでも異なる結果を返す)場合、これが問題となります。
    URL を毎回ユニークにするためにリクエストIDを付与すると良いでしょう。

例えば、auからのアクセスに限りリクエストIDを付与したい場合は、以下のようにします。

SuperPage.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
public abstract class SuperPage extends Page {
    RequestParameter.Mobile    agent;
 
  /**
   * 出力情報の設定を行う。
   * @param from 遷移元ページ。直接呼ばれている場合はnullです。
   * @param req リクエスト内容。
   * @return 出力ページ。
   * nullを返すとthisをリターンしたのと同じ扱いにされます。
   * @exception PageException 処理の継続が不可能(ブラウザには500を返す)。
   */
  public final Page output( Page from, RequestParameter req ) throws PageException {
    // 共通処理等あれば記述して下さい。
    agent = req.judgMobile();
    return outputMain( from, req );
  }
 
    /**
     * 処理済みリクエストの再呼び出しを検出するか?
     * このページに遷移するためのURIを生成する際のリクエストID付与をコントロール
     * します。trueを返すとリクエストIDが付与されます。
     * @return true:検出する、false:検出しない。
     */
    public boolean isCheckRepeatSameRequest() {
        // 各ページで、処理済みリクエストの再呼び出しを検出したい場合には
        // オーバーライドしてtrueを返して下さい。
        return agent == RequestParameter.Mobile.AU;
    }

同一 URL 対策

続いて2番についてです。
ページレイアウトが同じで内容が切り替わるようなページであれば、 CGI 等(同一 URL パス)にクエリでパラメータ指定する事で、表示を切り替えるのが通常の手法です。
これに対し、以下のようなサイトが存在します。

  • 通販大手サイト某A社。
    商品詳細の動的ページは同一リソースですが、 URL パス自体に商品名を埋め込んでいます。Google Chrome で閲覧すると分かりやすいです。
    検索エンジンは、商品毎に別ページであると認識します。
  • ブログサイト。
    記事表示の動的ページは同一リソースですが、投稿日等を URL に埋め込みクエリ部分を完全に無くしています。
    検索エンジンは、記事毎に別ページであると認識します。

Paraselene では、このような URL 生成方法として、 Page の getAliasURI を使用します。
例えば通販サイトを構築するとし、商品ページ(Shop.java)の表示パラメータが商品IDだとします。

Shop.hava
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
    /**
     * 別名URI設定。nullを返すと別名は設定しません。
     * 最低4文字指定して下さい。
     * ".na"で終えると完全一致となりますが、".na"で無ければ先頭一致となります。
     * @return URI。
     */
    public String getAliasURI() {
        return "shop";
    }
 
    /**
     * 出力情報の設定を行う。
     * @param from 遷移元ページ。直接呼ばれている場合はnullです。
     * @param req リクエスト内容。
     * @return 出力ページ。
     * nullを返すとthisをリターンしたのと同じ扱いにされます。
     * @exception PageException 処理の継続が不可能(ブラウザには500を返す)。
     */
    public Page outputMain( Page from, RequestParameter req ) throws PageException {
        // 出力内容を設定します。
        // 初期化したい場合は、init()をコールして下さい。
        String id = pickAliasURI( req );
        return this;
    }

このページを呼び出すためのリンクの生成は、以下のようになります。

1:
getUrlA().setAttribute( createAliasToURI( "href", PageType.SHOP_HTML, "123", null ) );

getUrlAが、商品ページへの<A>タグです。
createAliasToURIに"123"を渡す事により、shop123.na というURLを生成します。

getAliasURIなので、遷移元が存在しないURLとなります。遷移元のinputMainはコールされませんので注意して下さい。

最終更新: 2009/10/16
特に明示されていない限り、本Wikiの内容は次のライセンスに従います:CC Attribution 3.0 Unported
文書の先頭へ
SourceForge.JP
2009 © Akira Terasaki.  
Driven by DokuWiki The Apache Software Foundation