4.11 Apache URLの書き換え
Apacheサーバーでは、書き換えディレクティブを使用してURL操作を行う強力な方法が提供されます。
詳細は、以下を参照してください。
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
以下の例は、これらの書き換えディレクティブの使用方法を示しています。
例1
URL:"/myservice?request=xml&service=neworder" を "/cgi-bin/jsmdirect?neworder" に書き換え
サンプルURL:http://10.2.0.170:1099/myservice?request=xml&service=neworder
URLにサービス名の値のペアが含まれる場合、/cgi-bin/jsmdirect?<値>が呼び出されます。そうでない場合は、/cgi-bin/jsmdirect?defaultが呼び出されます。
RewriteCond %{QUERY_STRING} service\=([^\&]+)
RewriteRule ^/myservice(.*) /cgi-bin/jsmdirect?%1 [L,PT]
RewriteRule ^/myservice(.*) /cgi-bin/jsmdirect?default [L,PT]
RewriteCondは、service=のQUERY_STRINGをチェックして、&以外の値をパラメータ化します。
条件が真の場合、次のRewriteRuleを実行します。真でなければこのルールはスキップされ、他のルールが実行されます。
注:
RewriteRuleディレクティブでクエリー文字列は使用できません。
クエリー文字列は、mod_rewriteがディレクトリごとのコンテキストで有効になるまでにquery_string環境変数に移動しています。
RewriteCondは、その後の最初のRewriteRuleにのみ有効です。
以降のRewriteRuleには適用されないため、%1の後方参照は、2番目、3番目、以降のRewriteRuleに対して未定義になります。
例2
URL:"/parts/00345" を "/cgi-bin/jsmdirect?orderbind+id(00345)" に書き換え
サンプルURL:http://10.2.0.170:1099/parts/00345
RewriteRule ^/parts/(.*) /cgi-bin/jsmdirect?orderbind+id($1) [L,PT]
例3
URL:"/parts/00345/abc" を "/cgi-bin/jsmdirect?orderbind+id(00345)+item(abc)" に書き換え
サンプルURL:http://10.2.0.170:1099/parts/00345/abc
RewriteRule ^/parts/(.*)/(.*) /cgi-sec/jsmdirect?orderbind+id($1)+item($2) [L,PT]
Apache構成ファイルのサンプル
# Apache構成 - JSMサービス
Options None
Listen 10.2.0.170:1099
ServerRoot /www/jsmapache
DocumentRoot /www/jsmapache/htdocs
# DefaultFsCCSID 37
# DefaultNetCCSID 819
# ServerUserID USERPROFILE
#
LogLevel Warn
LogCycle Daily
ErrorLog logs/error_log
CustomLog logs/access_log combined
LogFormat "%{User-agent}i" agent
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{Cookie}n \"%r\" %t" cookie
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#
SetEnvIf "User-Agent" "Mozilla/2" nokeepalive
SetEnvIf "User-Agent" "JDK/1\.0" force-response-1.0
SetEnvIf "User-Agent" "Java/1\.0" force-response-1.0
SetEnvIf "User-Agent" "RealPlayer 4\.0" force-response-1.0
SetEnvIf "User-Agent" "MSIE 4\.0b2;" nokeepalive
SetEnvIf "User-Agent" "MSIE 4\.0b2;" force-response-1.0
#
# StartCGI 1
# SendBufferSize 32768
# ReceiveBufferSize 32768
#
#ユーザー名ベースの仮想ホスティング
NameVirtualHost 10.2.0.170
#
<VirtualHost 10.2.0.170>
#最初の仮想ホストのディレクティブが省略値のホストになる
#これは、サポートされないまたはホスト名がないIPアドレスの使用を捕捉する
#ドキュメントのルート・ディレクトリにアクセスする権限もない
Options None
ServerName 10.2.0.170
DocumentRoot /www/jsmapache/htdocs
</VirtualHost>
#
<VirtualHost 10.2.0.170>
Options None
ServerName LANSA01
ServerAlias LANSA01.LANSA.COM.AU
DocumentRoot /www/jsmapache/htdocs-site1
CGIConvMode BINARY
ErrorDocument 403 /noaccess.html
ErrorDocument 404 /notfound.html
ScriptAliasMatch ^/cgi-bin/jsmproxy(.*) /qsys.lib/devjsm.lib/jsmproxy.pgm$1
ScriptAliasMatch ^/cgi-bin/jsmdirect(.*) /qsys.lib/devjsm.lib/jsmdirect.pgm$1
ScriptAliasMatch ^/cgi-sec/jsmdirect(.*) /qsys.lib/secure.lib/jsmdirect.pgm$1
TimeOut 3000
#
RewriteEngine On
# RewriteLog rewrite-site1.log
# RewriteLogLevel 9
#
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [L,F]
#
RewriteRule ^/parts/(.*)/(.*) /cgi-sec/jsmdirect?orderbind+id($1)+item($2) [L,PT]
RewriteRule ^/parts/(.*) /cgi-bin/jsmdirect?orderbind+id($1) [L,PT]
RewriteRule ^/parts /cgi-bin/jsmdirect?orderbind+id(*NONE) [L,PT]
#
RewriteCond %{QUERY_STRING} service\=([^\&]+)
RewriteRule ^/myservice(.*) /cgi-bin/jsmdirect?%1 [L,PT]
RewriteRule ^/myservice(.*) /cgi-bin/jsmdirect?default [L,PT]
#
RewriteCond %{TIME_HOUR}%{TIME_MIN} >0905
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^/mypage.html /day.html [L]
RewriteRule ^/mypage.html /night.html [L]
#
# RewriteCond %{TIME_HOUR}%{TIME_MIN} <1300 [OR]
# RewriteCond %{TIME_HOUR}%{TIME_MIN} >1500
# RewriteRule ^/cgi-bin/jsmdirect(.*) /noaccess.html [L]
#
# RewriteMap companymap txt:/www/jsmapache/company.map
# RewriteRule ^/company/(.*) ${companymap:$1|http://nocompany.com} [L,R]
#
# RewriteMap hostmap rnd:/www/jsmapache/randomhost.map
# RewriteRule ^/(.*\.(pdf|gif|jpg)) http://${hostmap:static}/$1 [L,R]
#
<Directory /www/jsmapache/htdocs-site1>
Options None
Order Allow,Deny
Allow from all
AllowOverride None
</Directory>
#
<Directory /qsys.lib/devjsm.lib>
Options None
Order Allow,Deny
Allow from all
AllowOverride None
#有効なユーザーが必要
#認証タイプ Basic
#認証名"Restricted Service"
#ユーザーID QTMHHTP1
# パスワード・ファイル %%SYSTEM%%
</Directory>
#
<Directory /qsys.lib/secure.lib>
Options None
Order Allow,Deny
Allow from all
AllowOverride None
Require valid-user
AuthType Basic
AuthName "Restricted Service"
#ユーザーID QTMHHTP1
PasswdFile %%SYSTEM%%
</Directory>
</VirtualHost>
#
<VirtualHost 10.2.0.170>
Options None
ServerName STUDIOADMIN
DocumentRoot /www/jsmapache/htdocs-site2
CGIConvMode BINARY
ScriptAliasMatch ^/cgi-bin/jsmadmin(.*) /qsys.lib/devjsm.lib/jsmadmin.pgm$1
#
<Directory /www/jsmapache/htdocs-site2>
Options None
Order Allow,Deny
Allow from all
AllowOverride None
</Directory>
#
<Directory /qsys.lib/devjsm.lib>
Options None
Order Allow,Deny
Allow from 10.2.1.46
Allow from 10.2.1.47
Allow from 10.2.1.48
AllowOverride None
</Directory>
</VirtualHost>
#
#グローバル・サーバー・ディレクティブ
#
<Directory />
Options None
Order Allow,Deny
Deny from all
AllowOverride None
</Directory>
#
<Directory /www/jsmapache/htdocs>
Options None
Order Allow,Deny
Deny from all
AllowOverride None
</Directory>