web-dev-qa-db-ja.com

Apache2:書き換えルール付きの400 Bad Request、エラーログには何もない?

これは私にナッツを運転しています。

背景:組み込みのApache2を使用しています&PHP Mac OS X 10.6に付属しています)

私は次のように仮想ホストを設定しています:

NameVirtualHost *:81

<Directory "/Users/neezer/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<VirtualHost *:81>
    ServerName lobster.dev
    ServerAlias *.lobster.dev
    DocumentRoot /Users/neezer/Sites/lobster/www

    RewriteEngine On
    RewriteCond $1 !^(index\.php|resources|robots\.txt)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L,QSA]

    LogLevel debug
    ErrorLog /private/var/log/Apache2/lobster_error
</VirtualHost>

これは/private/etc/Apache2/users/neezer.confにあります。

lobster projectの私のコードは、PHP with CodeIgniter framework です。ロードしようとしています http://lobster.dev:81/ くれます:

400不正な要求

通常、ログをチェックして原因を調べますが、ログは空です。 /private/var/log/Apache2/error_log/private/var/log/Apache2/lobster_errorの両方を調べましたが、どちらも400に関連するメッセージを記録していません。/private/etc/Apache2/http.confLogLeveldebugに設定しています。

書き換えルールを削除するとエラーは解消されますが、これらの同じルールは私のMAMPホストで機能します。私は再確認し、デフォルトのApacheインストールにrewrite_moduleが読み込まれました。私のhttp.confはここにあります: https://Gist.github.com/1057091

何ができますか?追加情報が必要な場合はお知らせください。

注:プロジェクトディレクトリの.htaccessに書き換えルールを追加したくありません(gitリポジトリにチェックインされているので、変更したくありません)。

5
neezer

複雑なmod_rewriteルールの場合、イベントのシーケンスをログに記録して、何が起こっているかを確認することをお勧めします。 RewriteLog を使用してこれを実行し、 RewriteLogLevel を上げて詳細を確認します。

mod_rewriteは非常に柔軟で、書き換えルールを使用して多くのことができ、また非常に複雑です。部外者は、より広いコンテキストを見ないでルールをデバッグするのに苦労します。自分でデバッグできる最善の方法。 2番目のウィンドウで構成の変更を実験しながら、1つのウィンドウでログを確認します。小さな変更を加え、ファイルを保存し、Apacheをリロードして、もう一度URLにアクセスします。繰り返す。

以下は、ApacheのRewriteLogの良い説明です manual

ログの書き換え

Mod_rewriteの強力で複雑な機能を使用する場合、ほとんどの場合、デバッグに役立つRewriteLogを使用する必要があります。このログファイルは、書き換えエンジンが要求を変換する方法の詳細な分析を生成します。詳細レベルはRewriteLogLevelディレクティブによって制御されます。

6

<virtualhost>コンテキストでの置換は、絶対ではないURLを使用しています。 Directory/htaccessコンテキストの外でこれを行うことはできません。

3
covener

他のいくつかのメモは、単なるコメントに含めるには少し大きすぎます。

_RewriteCond $1_は機能しますが、非常に危険で脆弱です。特に、RewriteCondの機能を完全に無効にするようにRewriteRuleを簡単に書き換えることができ、それがどのバージョンかわかりませんでした。ソリューションとして、RewriteCond %{REQUEST_URI} ^/(index\.php|resources|robots\.txt)のように_%{REQUEST_URI}_の使用をお勧めします。

次の問題:次の2行:

_RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
_

提示されているように機能していません。これらは、_<Directory>_スタンザ内に配置するか、先読みマクロを使用するように変更する必要があります(例:_RewriteCond %{LA-U:REQUEST_FILENAME} !-f_)。

_/_を削除する必要がある実際の原因は、_.htaccess_がRewriteRuleの最初の引数から先頭の_/_を削除するのに対し、_/_でそのままRewriteRulesに配信されることですhttpd.conf(またはそのIncludedファイル)。これは、このルールを.htaccessに戻そうとする場合に備えて、覚えておくことが重要です。 RewriteRule ^/?(.*)$ index.php/$1 [L,QSA]のようなことを行うことで、ルールを.htaccess/httpd.conf-agnosticに作り直すことができます。

最後に、上記のルールでわかるように、_/_をバックスラッシュでエスケープする必要はありません。

2
BMDan