- ベストアンサー
mod_rewriteの書き方について
- mod_rewriteの書き方について質問させていただきます。複数の設定をしたいのですが、404のエラーが出てしまい思っている動作になりません。
- パラメーターがあった場合、URLの書き換えが正常に動作していますが、HTMLファイルへのアクセス時に404のエラーになってしまいます。
- 解決策を教えていただけると助かります。ご教示よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
(回答1補足)の内容について、 それで問題ないはずです。私の手元で試したかぎりでは、それで書き換えは出来てそうです。 .htaccess の記述でエラーになっているとかはないですか? Apache のログはどうなっているか確認してみてください。 あと、(1)の条件は、記述が > RewriteCond %{REQUEST_FILENAME} !-f > RewriteCond %{REQUEST_FILENAME} !-d > RewriteRule hoge/(.*)\/(.*)\/(.*)\/(.*)\.html$ hoge/$1/$2.php?$3=$4 [L] だと、2の条件が正しく動作しないと思います。 たとえば、 http://www.hoge.com/hoge/abc/def/ghi/jkl/mno/pqr.html は、この条件に $1=abc/def/ghi、$2=jkl、$3=mno、$4=pqr とマッチします。 > RewriteRule hoge/([^/]*)\/([^/]*)\/([^/]*)\/([^/]*)\.html$ hoge/$1/$2.php?$3=$4 [L] とすべきでしょう。引数が3個以上も考えるなら、(2)の条件も同様にすべきです。
その他の回答 (2)
- mtaka2
- ベストアンサー率73% (867/1179)
回答1で書かれている通り、RewriteCond は毎回記述する必要があります。 > category.html の場合は、内部で変換をしていません。 質問者さんの書かれた > RewriteRule (.*)\.html$ /$1.php [L] という記述は、無条件にすべての html に対して「内部で変換する」ような指定になっているのです。 > http://www.hoge.com/dir/index.html にアクセスした場合 > http://www.hoge.com/dir/category.html にアクセスした場合 この2つの条件の違いを明確にしてください。 その条件というのが「指定したファイルが存在しないときはphpに変換する」(指定したファイルが存在するときは変換したくない)のだったら、 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*)\.html$ /$1.php [L] となります。この2行で1セットです。
補足
mtaka2さん、ご回答ありがとうございます。 ご教示いただいた通り、RewriteCond を設定ごとに記載しました。 -------------------------------------------------- RewriteEngine on (1) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule hoge/(.*)\/(.*)\/(.*)\/(.*)\.html$ /hoge/$1/$2.php?$3=$4 [L] (2) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule hoge/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\.html$ /hoge/$1/$2.php?$3=$4&$5=$6 [L] (3) # .php → .html RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*)\.html$ /$1.php [L] -------------------------------------------------- (3)の RewriteCond %{REQUEST_FILENAME} !-f を記載することで (1)と(2)のパラメータが取得できなくなってしまいました。 表示の順序としては以下のように考えています。 (A)パラメータがある場合、パラメータを取得したい。(内部変換) mod_rewriteでは(1)と(2)で記述。 (B)パラメータなどがない場合、アクセスはHTMLだけどPHPファイルを表示したい。(内部変換) mod_rewriteでは(3)で記述。この処理がうまくいってないのではないかと思っています。 (C)アクセスがHTMLでHTMLファイルを表示したい。(内部変換なし) 間違っている部分をご指摘いただけますでしょうか。 よろしくお願いいたします。
- BellBell
- ベストアンサー率54% (327/598)
>ただ、http://www.hoge.com/dir/category.html にアクセスした場合 >PHPファイルではなく、HTML(/dir/category.html)の場合404のエラーになってしまいます。 http://www.hoge.com/dir/category.html これを、内部で http://www.hoge.com/dir/category.php と書き換えてアクセスしてるんだから、category.phpが無ければ404エラーになって当たり前って話ですか? RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d は直後のRewriteRule一行のみにしか効きません。 いちいち面倒でも、下記のようにする必要があります。 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule hogehoge RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule fugafuga RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ponyoponyo
補足
BellBellさん、ご回答ありがとうございます。 > http://www.hoge.com/dir/category.html > これを、内部で > http://www.hoge.com/dir/category.php > と書き換えてアクセスしてるんだから、category.phpが無ければ404エラーになって当たり前って話ですか? category.html の場合は、内部で変換をしていません。 http://www.hoge.com/dir/category.html にアクセスしたら、/dir/category.html を表示したいと思っております。(PHPファイルではない) 分かりづらくて申し訳ございません。
補足
mtaka2さん、ご回答ありがとうございます。 (.*)\ ↑の全ての文字列というのがよくないのでしょうか。 下記のURLは同じ意味です。 http://www.hoge.com/hoge/_dir/filename.php?j1=11 http://www.hoge.com/hoge/_dir/filename/j1/11.html hoge → 必ず固定となっています。 _dir → アンダーバーと英字が入ってくる可能性があります。 fimenam → アンダーバー・英数字の可能性があります。 j1 → 英数字です。 11 → 数字のみです。 上記のことを踏まえて、mod_rewriteを書き直してみました。 ------------------------------------------------------------ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule exec/(.*)\/([a-z]+)/([0-9a-z]+)/([0-9]+)\.html$ /exec/$1/$2.php?$3=$4 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule exec/(.*)\/([a-z]+)/([0-9a-z]+)/([0-9]+)/([0-9a-z]+)/([0-9]+)\.html$ /exec/$1/$2.php?$3=$4&$5=$6 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*)\.html$ /$1.php [L] ------------------------------------------------------------ 上記の場合だと、not foundになってしまいました。 mtaka2さんにご提示いただきました、下記ルールを試してみたのですが not foundになってしまいました。 RewriteRule hoge/([^/]*)\/([^/]*)\/([^/]*)\/([^/]*)\.html$ hoge/$1/$2.php?$3=$4 [L] レンタルサーバのため、Apacheのログを見ることができません。 よろしくお願いいたします。