blog

Windows版Apache2.2のSCRIPT_NAMEはおかしい

2009-12-09 04:50:29 Windows Apache symfony Comments: 0
前提

LinuxはCentOS 5.3に標準で入っているApache 2.2.3
Windowsはxampp 1.7.2のApache 2.2.12

アクセス先 http://example.com/fixed/variable/foo
DocumentRoot  /sites
AliasMatch ^/fixed/([^/]*)/(.*) "/sites/$1/fixed/$2"
実際にアクセスするスクリプト /sites/variable/web/index.php

結果

LinuxのSCRIPT_NAME /fixed/variable/foo/index.php
WindowsのSCRIPT_NAME /variable/web/index.php

AliasMatchをAliasに変えても同じ。
mod_rewriteをOffにするとLinuxと一緒の挙動になる。ひどい。

そして、REQUEST_URIはなぜかhttpから始まる完全な書式になる。

LinuxのREQUEST_URI /fixed/variable/foo
WindowsのREQUEST_URI http://example.com/fixed/variable/foo

さらに、DocumentRoot  を実際にアクセスするスクリプトの親ディレクトリではない場所にすると、
404エラーが返るようになる。

「xamppで開発する奴が悪い」とか言われそうだけど、他にハマってる人いないんだろうか。。
symfonyはSCRIPT_NAMEを利用してrelativeUrlRootを決めているので、常にOops!と言われてしまう。

AliasMatchは先頭一致ではない

2009-07-20 19:33:40 Apache Comments: 0
引き続きApacheのhttpd.confのお話。

Alias /hoge /foo/bar/baz/hoge
なんてのを、どのユーザディレクトリ直下にあるhogeにも適応させたいがために、
AliasMatch ^/([^/]*)/hoge /foo/bar/baz/hoge
と書き直すと、なぜか動かなくなる。

正しくは、完全一致するように、
AliasMatch ^/([^/]*)/hoge/(.*)$ /foo/bar/baz/hoge/$2
などと書かないといけないのであった。

RewriteRuleはhttpd.confに書かない方がいい

2009-07-19 20:12:01 Apache Comments: 0
パフォーマンス稼ぎと一元管理のために、httpd.confにRewriteRuleを書こうとしてはまった。
.htaccessに書かれたRewriteRuleが解釈するパスは、自分自身からの相対パスだが、
httpd.confに書かれたRewriteRuleが解釈するパスは、絶対パスとして扱われるらしい。

その結果、たとえば「ドキュメントルート直下のindex.phpに引き渡す」という記述が相対パスでは書けないため、
UserDirとかVirtualDocumentRootとRewriteRuleを併用するとハマる。ここではRewriteBaseも使えない。

仕方がないので.htaccessを読み込むように設定するしか無さそうだ。

CentOSのhttpd.conf

2009-06-24 18:13:25 Linux Apache Comments: 0
他ディストリビューションと比べてデフォルト設定がやや制限気味なので注意する。

KeepAliveがOffになっているので、使うときはOnにする。
これをしないとアクセスされるたびにapacheのプロセスが沢山立ち上がってかなり憂鬱な事になる。
AllowOverrideがNoneになっているので、これをAllにする。
あと忘れがちなのが、ブラウザでアクセスすると403が返ってくる時は、
ドキュメントルートのあるDirectoryに対してAllow from allを追加する。

AllowOverrideの値については、
BASIC認証とかを使いたければ AuthConfig
mod_rewriteとかを使いたければFileInfo
DirectoryIndexとかを使いたければIndexes
Allowとかを使いたければLimit
なので、きっと全部使いたいと思うので、基本的にAllを指定して良いはず。

その他のコツとしては、VirtualHostは最初に1つダミーの定義をしておくと良い。
この定義が、他のすべての定義に引っかからなかった場合の既定の動作になる。

あと、はまりどころとしては、UserDirのワイルドカードは*だけど、
VirtualDocumentRootのサブドメイン名は%1で示す。混同すると変なところを読みに行くので注意。

1 4 件中 1 ~ 4 件目