IPv4・IPv6判別と簡易IPv6→IPv4変換 [Apache]
World IPv6 DayにちなんでIPv6の話題。
フロントにApacheのIPv6対応HTTPサーバを使っている分には、IPv4/IPv6どちらのアクセスからでも基本的にはWebアプリケーションは動く。
ただしアプリがREMOTE_ADDRを参照してIPアドレスをパースする処理を持っている場合、IPv6アドレスを考慮していない場合はエラーになったり、想定外の動きをする可能性がある。
(※ApacheではIPv6でもアクセス元IPアドレスはREMOTE_ADDRヘッダに入ってくる)
そんなシステムでとりあえずアプリの改修なしでIPv6でアクセスを処理したい場合、ApacheでIPv4アドレスである127.0.0.1にプロキシしてやることで強制的にREMOTE_ADDRをIPv4アドレスである127.0.0.1にすることができる。
アドレスの処理自体がアプリケーションのキモである場合は当然ながら意味のない処理になってしまうが、IPv6アドレスのアドレス表記にはコロン(:)がに含まれるので上記のような記述でIPv4アドレスからのアクセスはそのまま処理、IPv6アドレスからのアクセスはIPv4アドレスに変換して処理することができる。
さすがにこれを運用環境でやることはあまりないだろうけど、実験や応急処置としてはお手軽な対処方法かと。
フロントにApacheのIPv6対応HTTPサーバを使っている分には、IPv4/IPv6どちらのアクセスからでも基本的にはWebアプリケーションは動く。
ただしアプリがREMOTE_ADDRを参照してIPアドレスをパースする処理を持っている場合、IPv6アドレスを考慮していない場合はエラーになったり、想定外の動きをする可能性がある。
(※ApacheではIPv6でもアクセス元IPアドレスはREMOTE_ADDRヘッダに入ってくる)
そんなシステムでとりあえずアプリの改修なしでIPv6でアクセスを処理したい場合、ApacheでIPv4アドレスである127.0.0.1にプロキシしてやることで強制的にREMOTE_ADDRをIPv4アドレスである127.0.0.1にすることができる。
RewriteEngine On
RewriteCond %{REMOTE_ADDR} :
RewriteRule ^(.*)$ http://127.0.0.1/$1 [P,L]
(※VirtualHostを使っている場合はヘッダやListenアドレス/ポートなどの考慮が必要)
アドレスの処理自体がアプリケーションのキモである場合は当然ながら意味のない処理になってしまうが、IPv6アドレスのアドレス表記にはコロン(:)がに含まれるので上記のような記述でIPv4アドレスからのアクセスはそのまま処理、IPv6アドレスからのアクセスはIPv4アドレスに変換して処理することができる。
さすがにこれを運用環境でやることはあまりないだろうけど、実験や応急処置としてはお手軽な対処方法かと。
設定ファイル上でのURLエンコードされたリクエストの取り扱い [Apache]
apache内部でリクエストURIを処理する過程で、そのURIに含まれるURLエンコードされている部分はデコードされてしまう。
これは、http://example1.com//%E3%83%86%E3%82%B9%E3%83%88 へのアクセスを http://example2.com/へリダイレクトさせようと
という設定を追加してもうまくいかない。
この場合は、
ここで注意するのが、全角文字の文字コード。この場合はきちんとUTF-8の「テスト」を書いてやる必要がある。
不安な場合は、EUC,SJIS,UTF-8全部で書いてしまうのが確実。
こんな記述しなくて済む方法をご存知の方はこっそり教えていただけるとうれしいです。
関連ケースとして、mod_rewriteで以下の設定を行った場合も
でアクセスした場合に、$1の中身は"%E3%83%86%E3%82%B9%E3%83%88"ではなく"テスト"になってしまうが、この場合はNEフラグを書いてやれば解決する。
これは、http://example1.com//%E3%83%86%E3%82%B9%E3%83%88 へのアクセスを http://example2.com/へリダイレクトさせようと
RedirectMatch \/%E3%83%86%E3%82%B9%E3%83%88 http://example2.com/
(※実ファイル上では改行しません)
という設定を追加してもうまくいかない。
この場合は、
RedirectMatch \/テスト http://example2.com/と記述しないとならない。
ここで注意するのが、全角文字の文字コード。この場合はきちんとUTF-8の「テスト」を書いてやる必要がある。
不安な場合は、EUC,SJIS,UTF-8全部で書いてしまうのが確実。
こんな記述しなくて済む方法をご存知の方はこっそり教えていただけるとうれしいです。
関連ケースとして、mod_rewriteで以下の設定を行った場合も
RewriteRule ^/hoge/(.*)$ /cgi-bin/hoge.cgi?=$1 [L]http://example.com/hoge/%E3%83%86%E3%82%B9%E3%83%88
でアクセスした場合に、$1の中身は"%E3%83%86%E3%82%B9%E3%83%88"ではなく"テスト"になってしまうが、この場合はNEフラグを書いてやれば解決する。
RewriteRule ^/hoge/(.*)$ /cgi-bin/hoge.cgi?=$1 [NE,L]
タグ:Apache
Apache2.2 ServerLimitの変更を有効にする際の注意 [Apache]
httpd.confのServerLimitを変更した場合、
または
としても設定が有効にならない。
例えば同時にMaxClientsを増やした時などは、error_logにもきっちりログが出る。
ServerLimitを変更した場合は、
とする必要がある。
#restart=stop → startと思ってたからこれはハマったハマった。
$ ./apachectl graceful
または
$ ./apachectl restart
としても設定が有効にならない。
例えば同時にMaxClientsを増やした時などは、error_logにもきっちりログが出る。
[Tue Jul 01 00:00:00 2008] [notice] SIGHUP received. Attempting to restart WARNING: MaxClients of 400 exceeds ServerLimit value of 256 servers, lowering MaxClients to 256. To increase, please see the ServerLimit directive.
ServerLimitを変更した場合は、
$ ./apachectl stop (もしくはgraceful-stop)
$ ./apachectl start
とする必要がある。
#restart=stop → startと思ってたからこれはハマったハマった。