リンク変換

概要

x-Servletは元コンテンツに記載されているリンクを、場合に応じて適切なリンクに書き換えます。

動作

もし、x-Servletを経由して元コンテンツを取得したときに、リンク変換を行わずにML変換だけ行ってレスポンスを返してしまうと、そのリンクを選択した場合にx-Servletを経由せずに元コンテンツを取りにいってしまいます。

リンク変換をしなかった場合の流れ

期待しているような動作のためにはx-Servletを経由して元コンテンツを取りに行くようにリンク変換をする必要があります。

リンク変換をした場合の流れ

注1) 全てのリンクを書き換えるのではなく、x-Servletを経由する必要のあるリンクのみを書き換えます。(詳細は後述)
注2) 以下での記述はリンクに関する動作にのみ当てはまります。<FORM>タグのaction属性で記述されているリンクは無条件にx-Servletを経由するように書き換えます。

機能説明

以下の3つのケースに分けて処理を行います。

1.リンクが相対パスで記述されている場合

変換は行いません。

2.リンクが絶対パスで記述されている場合

例えば、以下のような条件でx-Servletが動作しているものとします。

例)

contentsRule.xml
<ContentsRule>
  <ConditionHost></ConditionHost>
  <ConditionPort></ConditionPort>
  <ConditionDir>/test</ConditionDir>

  <Host>ksk.co.jp</Host>
  <Port>80</Port>
  <PreDir>/mobile</PreDir>
</ContentsRule>

リクエスト
http://x-servlet.com/test/top.html

このとき、元コンテンツとして
http://ksk.co.jp:80/mobile/top.html
をWebサーバから取得することになります。

このコンテンツ中に、"/mobile/next.html" というリンクが記述されている場合のことを考えます。
ブラウザでリンク変換後のリンクをクリックしたときに元コンテンツとして
http://ksk.co.jp:80/mobile/next.html
を取得するようなリンクに書き換えればよいわけです。

今回の場合
"/test/next.html" がこれにあたります。

変換は以下のように行ないます。

  1. 適用されるルールはリクエスト変換時に選択されたルールが用いられます。
  2. ルールのPreDirを基準ディレクトリとしたときの元リンクの相対表現(「PreDir相対表現」と記述します)を取得します。

    例1)
    ${PreDir} "/mobile"
    元リンク "/mobile/next.html"
    -> PreDir相対表現 "/next.html"

    例2)
    ${PreDir} "/mobile"
    元リンク "/pc/top.html"
    -> PreDir相対表現 "/../pc/top.html"

  3. ルールのConditionDirとPreDir相対表現を連結する。

    例1)
    ${ConditionDir} "/test"
    PreDir相対表現 "/next.html"
    -> ${conditionDir}+${PreDir相対表現}
    "/test/next.html"

    例2)
    ${ConditionDir} "/test"
    PreDir相対表現 "/../pc/top.html"
    -> ${conditionDir}+${PreDir相対表現}
    "/test/../pc/top.html"

絶対パスのリンクが出現した場合、基本的には上記の方法で書き換えを行います。

3.リンクが絶対URIで記述されている場合

ホストを移動するような場合に絶対URIでリンクが記述されます。

contentsRule.xmlに登録されているいずれかのコンテンツルールを用いてその絶対URIに到達できる場合にはそのリンクはx-Servletを経由するように変換する必要があります。 逆にcontentsRule.xmlに登録されているどのコンテンツルールを用いてもその絶対URIに到達できない場合にはそのリンクを書き換える必要は有りません。 (書き換えたとしても、適切なルールが無いため元コンテンツを取得できません)

例)

以下の2つのルールが記述されている状態でx-Servletが動作しているものとします。
contentsRule.xml

<!--ルール1>-->
<ContentsRule>
  <ConditionHost>x-servlet.com</ConditionHost>
  <ConditionPort></ConditionPort>
  <ConditionDir>/test</ConditionDir>
  <ConditionUAGroup></ConditionUAGroup>

  <Scheme></Scheme>
  <Host>ksk.com</Host>
  <Port>80</Port>
  <PreDir>/mobile</PreDir>
</ContentsRule>

<!--ルール2>-->
<ContentsRule>
  <ConditionHost>x-servlet.co.jp</ConditionHost>
  <ConditionPort></ConditionPort>
  <ConditionDir>/test</ConditionDir>
  <ConditionUAGroup></ConditionUAGroup>

  <Scheme></Scheme>
  <Host>ksk.co.jp</Host>
  <Port>80</Port>
  <PreDir>/pc</PreDir>
</ContentsRule>

このとき、
http://x-servlet.com/test/top.html

というリクエストが来た場合、ルール1が適用され元コンテンツとして
http://ksk.com:80/mobile/top.html
をWebサーバから取得することになります。このコンテンツ中に、
http://ksk.co.jp/pc/top.html
という絶対URIが記述されていた場合、この絶対URIにはルール2を用いることで到達可能なのでこの絶対URIはリンク変換の対象として処理されます。

同様に、このコンテンツ中に
http://ksk.net/pc/top.html
という絶対URIが記述されていた場合、この絶対URIにはどのルールを用いても到達できないのでこのリンクは書き換えを行いません。

また、Schemeが異なるような
https://ksk.co.jp/pc/top.html
というようなリンクも登録されているルールでは到達不可能なので書き換えを行いません。

到達可能な絶対URIの書き換え手順を以下に記述します。

  1. 適用するルールを選択します
    contentsRule.xml内の<ContentsRule>を対象に使用するルールを選択します。<RedirectRule>は対象にしません。
    このとき現在アクセスしている端末を用いて到達可能なルールを選択します。
    複数のルールでその絶対URIに到達可能な場合は、
        1)ConditionUAGroupの指定があるルール
        2)より詳細にConditionDirが指定されているルール
    で優先順位の高いものを選択し使用します。
  2. リンクを書き換える
    Scheme部
    • fakeSchemeが指定されている場合はその値でScheme部を書き換えます。
    • fakeSchemeが指定されていない場合は、"http"で書き換えます。
    Host部
    • fakeHostが指定されている場合は、その値でHost部を書き換えます。
    • fakeHostの指定は無いがConditionHostが指定されている場合は、その値でHost部を書き換えます。
    • fakeHostもConditionHostも指定されていない場合は、Hostリクエストヘッダに指定されていたホストでHost部を書き換えます。
    Port部
    • fakePortが指定されている場合は、その値でPort部を書き換えます。
    • fakePortの指定は無いがConditionPortが指定されている場合は、その値でPort部を書き換えます。
    • fakePortもConditionPortも指定されていない場合は、Hostリクエストヘッダに指定されていたポートでPort部を書き換えます。
    ディレクトリ部の書き換え
    • 選択したルールを用いて「2)リンクが絶対パスで記述されている場合」と同様の変換を行ないます。

絶対URIのリンクが出現した場合には上記の方法で書き換えを行います。

注意点

  • サーバIDを使用した場合は、リンクが相対パスで記述されていても絶対パスに変換されます。
  • <base>タグを使用している場合はリンク変換が行われない場合がありますので注意が必要です。
  • <a>タグやLocationURLヘッダなどのリンクにパラメーターとして"/"又は"#"が含まれる文字列が指定されている場合は正常にリンク変換が行えませんのでそれぞれ"%2F"、"%23"にURLエンコードしておく必要があります。

    問題となる例

    <a href="/mobile/top.html?url=http://hoge.jp/top.html">
    <a href="/page.html?a#b">

    正しい記述

    <a href="/mobile/top.html?url=http:%2F%2Fhoge.jp%2Ftop.html">
    <a href="/page.html?a%23b">
TOP