web-dev-qa-db-ja.com

mod_rewrite「400BadRequest」の問題

Mod_rewriteの設定中にBadRequestエラーを乗り越えることができないようです。私はしばらくの間試みてきたので、これが私が持っているものです。

アクセスしようとしているURLは次のとおりです。

gordons.local/brewCalc

私が見たいページは

gordons.local/index.php?page=brewCalc

これが私の書き換えルールです:

    RewriteEngine on
    RewriteLog /var/www/gordons.com/logs/rewrite.log
    RewriteRule ([^/]+)/?$ index.php?page=$1 [L]

正規表現ツールを使用しましたが、 このツール ですが、最終的に次のようなページが表示されます。

Bad Request

Your browser sent a request that this server could not understand.
Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request.

Apache/2.2.12 (Ubuntu) Server at gordons.local Port 80

また、アクセス、エラー、または書き換えログに情報がありません。

編集:私の書き換えルールは私のvhostファイルにあります。 (/etc/Apache2/sites-available/gordons.local)

14
Parris Varney

誰かがここにいることに気付いた場合に備えて、私の問題は、交換前の先頭のスラッシュがないことでした。

RewriteRule ([^/]+)/?$ index.php?page=$1 [L]

になるはずだった

RewriteRule ([^/]+)/?$ /index.php?page=$1 [L]

Grrrr..。

86
Parris Varney

Apacheのerror.logが表示されている場合は、実際のエラーを確認できます。上記のルールを.htaccessファイルに入れようとしていて、RewriteLogが.htaccessファイルで許可されていない可能性があります。また、RewriteRuleは意図した以上にリダイレクトします。したがって、RewriteLogをコメントアウトし、RewriteRuleを次のようにすると、機能するはずです。

RewriteEngine On
RewriteBase /

# request is not for a file
RewriteCond %{REQUEST_FILENAME} !-f
# request is not for a directory
RewriteCond %{REQUEST_FILENAME} !-d
# forward to index.php
RewriteRule ^([^/]+)/?$ index.php?page=$1 [L,QSA,NC,NE]
  • NC-ケース比較を無視する
  • NE-RHSURIをエンコードしない
  • QSA-既存のクエリ文字列を新しいクエリ文字列に追加します
  • L-最後のルールをマークする
2
anubhava