これは私にナッツを運転しています。
背景:組み込みの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.conf
でLogLevel
をdebug
に設定しています。
書き換えルールを削除するとエラーは解消されますが、これらの同じルールは私のMAMPホストで機能します。私は再確認し、デフォルトのApacheインストールにrewrite_module
が読み込まれました。私のhttp.conf
はここにあります: https://Gist.github.com/1057091
何ができますか?追加情報が必要な場合はお知らせください。
注:プロジェクトディレクトリの.htaccess
に書き換えルールを追加したくありません(gitリポジトリにチェックインされているので、変更したくありません)。
複雑なmod_rewriteルールの場合、イベントのシーケンスをログに記録して、何が起こっているかを確認することをお勧めします。 RewriteLog を使用してこれを実行し、 RewriteLogLevel を上げて詳細を確認します。
mod_rewriteは非常に柔軟で、書き換えルールを使用して多くのことができ、また非常に複雑です。部外者は、より広いコンテキストを見ないでルールをデバッグするのに苦労します。自分でデバッグできる最善の方法。 2番目のウィンドウで構成の変更を実験しながら、1つのウィンドウでログを確認します。小さな変更を加え、ファイルを保存し、Apacheをリロードして、もう一度URLにアクセスします。繰り返す。
以下は、ApacheのRewriteLogの良い説明です manual :
ログの書き換え
Mod_rewriteの強力で複雑な機能を使用する場合、ほとんどの場合、デバッグに役立つRewriteLogを使用する必要があります。このログファイルは、書き換えエンジンが要求を変換する方法の詳細な分析を生成します。詳細レベルはRewriteLogLevelディレクティブによって制御されます。
<virtualhost>
コンテキストでの置換は、絶対ではないURLを使用しています。 Directory/htaccessコンテキストの外でこれを行うことはできません。
他のいくつかのメモは、単なるコメントに含めるには少し大きすぎます。
_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(またはそのInclude
dファイル)。これは、このルールを.htaccessに戻そうとする場合に備えて、覚えておくことが重要です。 RewriteRule ^/?(.*)$ index.php/$1 [L,QSA]
のようなことを行うことで、ルールを.htaccess/httpd.conf-agnosticに作り直すことができます。
最後に、上記のルールでわかるように、_/
_をバックスラッシュでエスケープする必要はありません。