iAPへアクセスするURLが複数ある場合のベースURLの設定方法

公開日: 2014-08-18 / カテゴリ: 開発Blog

ここでは、ベースURL をリクエスト情報を基に切り替えるための手順を BaseUrlProvider のサンプル実装、Webサーバとの連携例と共に紹介します。 製品標準の設定では、テナント一つにつき、一つのベースURLのみが設定可能ですが、BaseUrlProvider インタフェースを実装することで、複数のベースURLを持たせることができます。 BaseUrlProvider は intra-mart Accel Platform 2014 Summer(Honoka) から導入されたインタフェースです。したがい、2014 Summer(Honoka) 以降で使用可能です。

注意事項

    1. IMBox の 通知情報, IM-Workflow のショートカットURL, IM-FileExchange のダウンロードURL、パスワードリマインダで複数のベースURLからのアクセスを実現したい場合、 メールテンプレートに以下のような形式で記述することで、任意のベースURL配下のURLにアクセスできます。

%ご利用環境のベースURL固定文字% + [ショートカットURL置換文字列]

    1. 詳細は以下の要件情報を参照してください。

・IM-Workflow ベースURLを含まない置換文字列を提供します(2015 Spring~) ・IMBOX IMBoxの通知情報に含まれるURLにベースURLを含まれないようにします(2014 Summer~) ・IM-FileExchange ベースURLを含まないURLを文字列置換可能にする(2015 Summer~) ・パスワードリマインダ ベースURLを含まないURLを文字列置換可能にする(2015 Summer~)

BaseUrlProvider の実装

リクエストヘッダーに応じて異なるベースURLを返却する BaseUrlProvide を実装します。

  1. 以下の内容のファイルを WEB-INF/classes/com/example/SampleBaseUrlProvider.java として保存します。

    package com.example;
    import javax.servlet.http.HttpServletRequest;
    import jp.co.intra_mart.common.annotation.Priority;
    import jp.co.intra_mart.foundation.platform.BaseUrlProvider;
    // Priority を設定することで、実装クラスの呼び出し順を制御できます。ここでは、100 とします。
    @Priority(value = 100)
    public class SampleBaseUrlProvider implements BaseUrlProvider {
        private static final String BASE_URL_HEADER_KEY = "x-com-example-base-url";
        @Override
        public String getBaseUrl(final HttpServletRequest request) {
            if (request == null) {
                return null;
            }
            final String baseUrlIdentifier = request.getHeader(BASE_URL_HEADER_KEY);
            if ("base1".equals(baseUrlIdentifier)) {
                // 80 番ポートのベースURLを返却します。
                // 返却する URL の末尾には「/」を付けないことに注意してください。
                return "http://192.168.1.1/imart";
            } else if ("base2".equals(baseUrlIdentifier)) {
                // 81 番ポートのベースURLを返却します。
                // 返却する URL の末尾には「/」を付けないことに注意してください。
                return "http://192.168.1.1:81/imart";
            } else {
                // null を返却することで、他の BaseUrlProvider に処理を委ねることができます。
                return null;
            }
        }
    }
    
  2. リクエストヘッダー「x-com-example-base-url」値が「base1」の場合「http://192.168.1.1/imart」、

  3. リクエストヘッダー「x-com-example-base-url」値が「base2」の場合「http://192.168.1.1:81/imart」になるように実装しています。

    com.example.SampleBaseUrlProvider
    

以降の手順は、Web サーバに Apache もしくは IIS を利用している想定で記述します。 ご使用の Web サーバに合わせて、読み進めてください。

Apache HTTP Server を使用している場合

Apache の VirtualHost 機能を利用し、入り口を2つ作成します。 2つの入り口に対して、mod_headers モジュールを利用し、リクエストヘッダー(x-com-example-base-url)をそれぞれ設定することでベースURLを切り替えます。

前提条件

モジュールの取得

本ドキュメントでは以下の Apache モジュールを利用します。 取得に当たっては、製品元のマニュアルを参照してください。

  • mod_proxy
  • mod_rewrite
  • mod_headers

手順

以降の手順では下記の環境を想定しています。

iAPのコンテキストパスimart
apacheのドキュメントルート/usr/local/apache/htdocs
静的ファイルの展開フォルダ/usr/local/apache/htdocs/imart
iAPのIPアドレス192.168.1.1
iAPのポート番号8080
apache(VirtualHost1)のIPアドレス192.168.1.1
apache(VirtualHost1)のポート番号80
apache(VirtualHost2)のIPアドレス192.168.1.1
apache(VirtualHost2)のポート番号81
  1. %APACHE_HOME%/conf/httpd.conf ファイルを開きます。
  2. Dynamic Shared Object (DSO) Support エリアに以下の設定を追加またはコメントアウトを外してください。
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule rewrite_module modules/mod_rewrite.so
    LoadModule headers_module modules/mod_headers.so
    
  3. 80, 81 番ポートをリッスンするよう、以下の設定を追加または編集してください。
    LISTEN 80
    LISTEN 81
    
  4. 末尾に以下の設定を追加してください。
    AllowEncodedSlashes On
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/imart/reverse_proxy/
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.gif|.*\.GIF)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.png|.*\.PNG)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.jpg|.*\.JPG)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.jpeg|.*\.JPEG)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.css|.*\.CSS)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.js|.*\.JS)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.swf|.*\.SWF)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.ico|.*\.ICO)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.svg|.*\.SVG)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.json|.*\.JSON)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.jar|.*\.JAR)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.xml|.*\.XML)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.yaml|.*\.YAML)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.txt|.*\.TXT)$ [OR]
    RewriteCond %{REQUEST_URI} ^/imart/(.*\.html|.*\.HTML|.*\.htm|.*\.HTM)$
    RewriteRule ^/imart/(.*)?$ /imart/$1
    
    RewriteCond %{HTTP:Connection} Upgrade [NC]
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteRule ^/imart/(.*)?$ ws://192.168.1.1:8080/imart/$1 [P,L]
    
    ProxyPreserveHost On
    ProxyPass /imart/ http://192.168.1.1:8080/imart/ nocanon
    ProxyPassReverse /imart/ http://192.168.1.1:8080/imart/ nocanon
    ProxyTimeout 1200
    
    <VirtualHost 192.168.1.1:80>
    RequestHeader append x-com-example-base-url "base1"
    </VirtualHost>
    <VirtualHost 192.168.1.1:81>
    RequestHeader append x-com-example-base-url "base2"
    </VirtualHost>
    
  5. Apache を再起動してください。
  6. 以下を確認してください。

Internet Information Services(IIS) を使用している場合

IIS の Web サイト機能を利用し、入り口を2つ作成します。 2つの入り口に対して、URL Rewrite モジュールを利用し、リクエストヘッダー(x-com-example-base-url)をそれぞれ設定することでベースURLを切り替えます。

前提条件

  • IIS の設定がされていること。

設定手順はセットアップガイド-Internet Information Services(IIS)を参照してください。

手順

以降の手順では下記の環境を想定しています。

iAP のコンテキストパスimart
IIS のルート ディレクトリC:\inetpub\wwwroot
静的ファイルの展開フォルダC:\imart
IIS の IP アドレス(Web サイト1)192.168.1.1
IIS のポート番号(Web サイト1)80
IIS の IP アドレス(Web サイト2)192.168.1.1
IIS のポート番号(Web サイト2)81
  1. web.config を以下のように変更します。 変更前

    <rewrite>
        <rules>
            <clear />
            <rule name="ReverseProxyInboundStatic" stopProcessing="true">
                <match url="^imart/(?!reverse_proxy/)(.*\.gif|.*\.png|.*\.jpg|.*\.jpeg|.*\.css|.*\.js|.*\.swf|.*\.ico|.*\.svg|.*\.json|.*\.jar|.*\.xml|.*\.yaml|.*\.txt|.*\.html|.*\.htm)"/>
                <action type="None" />
            </rule>
            <rule name="ReverseProxyInboundDynamic" stopProcessing="true">
                <match url="^imart/(.*)" />
                <action type="Rewrite" url="http://192.168.1.1:8080/imart/{R:1}" />
            </rule>
        </rules>
    </rewrite>
    

    変更後

    <rewrite>
        <rules>
            <clear />
            <rule name="ReverseProxyInboundStatic" stopProcessing="true">
                <match url="^imart/(?!reverse_proxy/)(.*\.gif|.*\.png|.*\.jpg|.*\.jpeg|.*\.css|.*\.js|.*\.swf|.*\.ico|.*\.svg|.*\.json|.*\.jar|.*\.xml|.*\.yaml|.*\.txt|.*\.html|.*\.htm)"/>
                <action type="None" />
            </rule>
            <rule name="ReverseProxyInboundDynamic1" stopProcessing="true">
                <match url="^imart/(.*)" />
                <action type="Rewrite" url="http://192.168.1.1:8080/imart/{R:1}" />
                <conditions>
                    <add input="{SERVER_PORT}" pattern="^80" />
                </conditions>
                <serverVariables>
                    <set name="HTTP_X_COM_EXAMPLE_BASE_URL" value="base1" />
                </serverVariables>
            </rule>
            <rule name="ReverseProxyInboundDynamic2" stopProcessing="true">
                <match url="^imart/(.*)" />
                <action type="Rewrite" url="http://192.168.1.1:8080/imart/{R:1}" />
                <conditions>
                    <add input="{SERVER_PORT}" pattern="^81" />
                </conditions>
                <serverVariables>
                    <set name="HTTP_X_COM_EXAMPLE_BASE_URL" value="base2" />
                </serverVariables>
            </rule>
        </rules>
    </rewrite>
    

    これにより、web.config の内容は以下のようになります。

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.web>
            <httpRuntime maxRequestLength="102400" requestPathInvalidCharacters="" />
            <customErrors mode="Off" />
        </system.web>
        <system.webServer>
            <security>
                <requestFiltering>
                    <requestLimits maxAllowedContentLength="104857600" />
                </requestFiltering>
            </security>
            <httpErrors errorMode="Detailed" />
            <rewrite>
                <rules>
                    <clear />
                    <rule name="ReverseProxyInboundStatic" stopProcessing="true">
                        <match url="^imart/(?!reverse_proxy/)(.*\.gif|.*\.png|.*\.jpg|.*\.jpeg|.*\.css|.*\.js|.*\.swf|.*\.ico|.*\.svg|.*\.json|.*\.jar|.*\.xml|.*\.yaml|.*\.txt|.*\.html|.*\.htm)" />
                        <action type="None" />
                    </rule>
                    <rule name="ReverseProxyInboundDynamic1" stopProcessing="true">
                        <match url="^imart/(.*)" />
                        <action type="Rewrite" url="http://192.168.1.1:8080/imart/{R:1}" />
                        <conditions>
                            <add input="{SERVER_PORT}" pattern="^80" />
                        </conditions>
                        <serverVariables>
                            <set name="HTTP_X_COM_EXAMPLE_BASE_URL" value="base1" />
                        </serverVariables>
                    </rule>
                    <rule name="ReverseProxyInboundDynamic2" stopProcessing="true">
                        <match url="^imart/(.*)" />
                        <action type="Rewrite"  url="http://192.168.1.1:8080/imart/{R:1}" />
                        <conditions>
                            <add input="{SERVER_PORT}" pattern="^81" />
                        </conditions>
                        <serverVariables>
                            <set name="HTTP_X_COM_EXAMPLE_BASE_URL" value="base2" />
                        </serverVariables>
                    </rule>
                </rules>
            </rewrite>
        </system.webServer>
    </configuration>
    
  2. 「サイト」を右クリックし、「Web サイトの追加」をクリックします。

    blog_1.png

  3. 以下のように設定し、「OK」をクリックします。

    サイト名Another Web Site(何でも構いません)
    物理パス%SystemDrive%\inetpub\wwwroot
    種類http
    IP アドレス未使用の IP アドレスすべて
    ポート81

    blog_2.png

  4. 「Another Web Site」を右クリックし、「仮想ディレクトリの追加」をクリックします。

    blog_3.png

  5. 以下のように設定し、「OK」をクリックします。

    エイリアスimart
    物理パスC:\imart

    blog_4.png

  6. 「Default Web Site」、「URL 書き換え」、「機能を開く」をクリックします。

    blog_5.png

  7. 「サーバ変数の表示」をクリックします。

    blog_6.png

  8. 「追加」をクリックします。

    blog_7.png

  9. 「サーバー変数名」に「HTTP_X_COM_EXAMPLE_BASE_URL」を入力し、「OK」をクリックします。

    blog_8.png

  10. 同様に「Another Web Site」の「許可されたサーバ変数」に「HTTP_X_COM_EXAMPLE_BASE_URL」を追加します。

  11. 「Another Web Site」、「URL 書き換え」、「機能を開く」をクリックします。

    blog_9.png

  12. 「ReverseProxyInboundStatic」、「ReverseProxyInboundDynamic1」、「ReverseProxyInboundDynamic2」が設定されていることを確認してください。

    blog_10

    存在しない場合、「Default Web Site」に存在する上記三つの URL 書き換え規則の設定を Another Web Site に追加してください。

  13. IIS を再起動してください。

  14. 以下を確認してください。

【参考】さらに汎用的な方法について ・WebServer が IIS の場合はこちら ・WebServer が Apache の場合はこちら