ここでは、ベースURL をリクエスト情報を基に切り替えるための手順を BaseUrlProvider のサンプル実装、Webサーバとの連携例と共に紹介します。 製品標準の設定では、テナント一つにつき、一つのベースURLのみが設定可能ですが、BaseUrlProvider インタフェースを実装することで、複数のベースURLを持たせることができます。 BaseUrlProvider は intra-mart Accel Platform 2014 Summer(Honoka) から導入されたインタフェースです。したがい、2014 Summer(Honoka) 以降で使用可能です。
注意事項
-
- IMBox の 通知情報, IM-Workflow のショートカットURL, IM-FileExchange のダウンロードURL、パスワードリマインダで複数のベースURLからのアクセスを実現したい場合、 メールテンプレートに以下のような形式で記述することで、任意のベースURL配下のURLにアクセスできます。
%ご利用環境のベースURL固定文字% + [ショートカットURL置換文字列]
-
- 詳細は以下の要件情報を参照してください。
・IM-Workflow ベースURLを含まない置換文字列を提供します(2015 Spring~) ・IMBOX IMBoxの通知情報に含まれるURLにベースURLを含まれないようにします(2014 Summer~) ・IM-FileExchange ベースURLを含まないURLを文字列置換可能にする(2015 Summer~) ・パスワードリマインダ ベースURLを含まないURLを文字列置換可能にする(2015 Summer~)
BaseUrlProvider の実装
リクエストヘッダーに応じて異なるベースURLを返却する BaseUrlProvide を実装します。
-
以下の内容のファイルを 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; } } } -
リクエストヘッダー「x-com-example-base-url」値が「base1」の場合「http://192.168.1.1/imart」、
-
リクエストヘッダー「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 HTTP Server を参照してください。
モジュールの取得
本ドキュメントでは以下の 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 |
- %APACHE_HOME%/conf/httpd.conf ファイルを開きます。
- 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 - 80, 81 番ポートをリッスンするよう、以下の設定を追加または編集してください。
LISTEN 80 LISTEN 81 - 末尾に以下の設定を追加してください。
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> - Apache を再起動してください。
- 以下を確認してください。
- http://192.168.1.1/imart/homeにアクセス
- ベースURLが http://192.168.1.1/imart/ になっていること
- http://192.168.1.1:81/imart/homeにアクセス
- ベースURLが http://192.168.1.1:81/imart/ になっていること
- http://192.168.1.1/imart/homeにアクセス
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 |
-
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> -
「サイト」を右クリックし、「Web サイトの追加」をクリックします。

-
以下のように設定し、「OK」をクリックします。
サイト名 Another Web Site(何でも構いません) 物理パス %SystemDrive%\inetpub\wwwroot種類 http IP アドレス 未使用の IP アドレスすべて ポート 81 
-
「Another Web Site」を右クリックし、「仮想ディレクトリの追加」をクリックします。

-
以下のように設定し、「OK」をクリックします。
エイリアス imart 物理パス C:\imart 
-
「Default Web Site」、「URL 書き換え」、「機能を開く」をクリックします。

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

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

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

-
同様に「Another Web Site」の「許可されたサーバ変数」に「HTTP_X_COM_EXAMPLE_BASE_URL」を追加します。
-
「Another Web Site」、「URL 書き換え」、「機能を開く」をクリックします。

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

存在しない場合、「Default Web Site」に存在する上記三つの URL 書き換え規則の設定を Another Web Site に追加してください。
-
IIS を再起動してください。
-
以下を確認してください。
- http://192.168.1.1/imart/homeにアクセス
- ベースURLが http://192.168.1.1/imart/ になっていること
- http://192.168.1.1:81/imart/homeにアクセス
- ベースURLが http://192.168.1.1:81/imart/ になっていること
- http://192.168.1.1/imart/homeにアクセス
【参考】さらに汎用的な方法について ・WebServer が IIS の場合はこちら ・WebServer が Apache の場合はこちら
