ラベル apache の投稿を表示しています。 すべての投稿を表示
ラベル apache の投稿を表示しています。 すべての投稿を表示

2011年10月30日日曜日

(小ネタ)apacheのAddDefaultCharsetはOffにすべき

apacheのディレクティブにAddDefaultCharsetというのがあります。 

text/htmlやtext/plainの文字列エンコーディングを指定できるのですが、これが厄介です。

何故なら一般的なブラウザはHTML内のmetaタグでの文字列エンコーディングより、HTTPレスポンスヘッダーの文字列エンコーディングを優先するからです。 

一つのapacheで複数文字列エンコーディングを指定する場合には
  • metaタグを駆使する
  • こまめにディレクトリを分けてAddDefaultCharsetを使う
とか工夫が必要です。

2011年9月24日土曜日

RewriteCondが効かずに困った

言わずと知れた、apacheのmod_rewriteエンジンですがRewriteCondとRewriteRuleの記述方法にはまってしまいました。普通の書き方は他に任せるとしてハマったポイントを書いておきます。

■RewriteCondは直後のRewriteRuleのみに適用される。
RewriteEngine On
RewriteCond %{HTTP_REFERER} $^ …①
RewriteRule ^/foo/(.*) /foo2/$1 [L] …②
RewriteRule ^/bar/(.*) /bar2/$1 [L] …③
上記の様な設定の時に①は、②にも③にも効きそうですが、実際には②にしか効きません。
だからリファラーがあっても、barはbar2にリダイレクトしてしまいます。

③にも効かせるには、(冗長ですが)下記の様に書く必要があります。

RewriteEngine On
RewriteCond %{HTTP_REFERER} $^
RewriteRule ^/foo/(.*) /foo2/$1 [L]
RewriteCond %{HTTP_REFERER} $^   # 同じ記載をする!
RewriteRule ^/bar/(.*) /bar2/$1 [L]

■RewriteCondはRewriteRuleの後に評価される。

RewriteEngine On
RewriteCond %{HTTP_REFERER} $^
RewriteRule ^/foo/(.*) /foo2/$1 [L]

上記の設定の場合「リファラーが空なら、リクエストが/foo/*の場合、/foo2/*へリダイレクトと思いたい所ですが、実際には「リクエストが/foo/*の場合、リファラーが空なら、/foo2/*へリダイレクト」という処理の流れになります。

「何でRewriteLogLevelを上げて見てみても、RewriteCond実行されてない!効いてないんちゃうか?」って時はこれが原因の可能性が高いです。

2011年1月19日水曜日

mod_proxy_html をあきらめて mod_substitute を試した

リバースプロキシ越しに、内部のサーバへ転送したいのですが、良くあるのが、パスがずれる問題。

何とかならんかなと調べてると、mod_proxy_html を利用すると、hrefを変換かけたり出来るようですが、centos5 でかなり悩んだのですが、、、、上手くいきません(全く効いていない?)。どうしようか悩んだ所


の様な話があり、mod_substitute を試そうと思いました。

ところが mod_substitue は apache2.2.7 から標準添付らしく、centos5 の apache2.2.3 には付いてないのです! さらに悩んだ所

http://corpocrat.com/2008/09/19/install-apache-mod_substitute/

を発見!ソースだけ取ってきて apxs でコンパイルかけちゃうみたいです。
という訳で

# wget http://www.meisei-u.ac.jp/mirror/apache/dist//httpd/httpd-2.2.17.tar.gz
# tar zxvf httpd-2.2.17.tar.gz
# cd httpd-2.2.17/modules/filters/
# cp mod_substitute.c /tmp
# cd /tmp
# apxs -aic mod_substitute.c

これでインストールが完了するので、少し設定

AddOutputFilterByType SUBSTITUTE text/html
Substitute s/inner.domain.com/mydomain.com/n


再起動後見てみると!!上手く動きました。感謝、感謝です。ちょっと怖いけど動いてるからいっか。。