- ベストアンサー
.htaccessのRewriteRule設定に関して
PHPでプログラムを組み、.htaccessにてRewriteRule設定を したところ、エラーになってしまい、困っております。 具体的には list.php にて商品を10件表示にし、「次のページへ」 「前のページへ」の リンクで「次のページへ」をクリックすると、次の11件~20件、 「前のページへ」で1件~10件を表示するという、よくある仕様を 設定したページなのですが、 「次のページへ」をクリックした後、「前のページへ」を クリックするとプラウザが止ってしまいます。 もともと、list.phpはRewrite設定で下記のように 設定しております。 RewriteEngine on RewriteBase / RewriteRule ^list.htm$ /list.php?page=$1&rows=$1&category_id=1&query=&sort=item_id+desc [QSA] 元URLはlist.phpですが、list.htmに見せています。 その上でさらに次のページ、前のページへのリンク先も 静的URLに見せるよう、下記のように設定しました。 RewriteEngine on RewriteBase / RewriteRule ^list/([0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+).htm$ /list.php?page=$1&rows=$1&category_id=$1&query=&sort=item_id+desc [QSA] 上記で例えば list.php?page=0&rows=10&category_id=7&query=&sort=item_id+desc のものを list/0/10/7.htm と表示すると読み込みに異常に時間がかかり、プラウザが止ってしまうのです。 list/10/10/7.htm であれば正常に表示できるのですが・・・。 list.phpには下記のように記述しております。 if ( $_GET['page'] == '' ) $_GET['page'] = 0; if ( $_GET['rows'] == '' ) $_GET['rows'] = 10; if ( $_GET['sort'] == '' ) $_GET['sort'] = 'item_id desc'; // $delta = 3 * $_GET['rows']; if ( $_GET['page'] - $delta < 0 ) $s = 0; else $s = $_GET['page'] - $delta; if ( $_GET['page'] + $delta > $num_rows ) $e = $num_rows; else $e = $_GET['page'] + $delta; <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="center"><span class="x12"><? if ( $_GET['page'] >= $_GET['rows'] ) { ?> <a href="list/<?= $_GET['rows'] - $_GET['page'] ?>/<?= $_GET['rows'] ?>/<?= $_GET['category_id'] ?>.htm">≪前のページ</a> <? } ?> <? for ( $m = $s; $m <= $e; $m = $m + $_GET['rows']) { ?> <a href="list/<?= $_GET['rows'] - $_GET['page'] ?>/<?= $_GET['rows'] ?>/<?= $_GET['category_id'] ?>.htm"> <? if ( $m == $_GET['page']) echo "$color" . (( $m / $_GET['rows'] ) + '1') . "</font>"; else echo ( $m / $_GET['rows'] + 1 ) ?></a> <? } ?> <? if ( $num_rows > $_GET['page'] + 1 ){ ?> <a href="list/<?= $_GET['page'] + $_GET['rows'] ?>/<?= $_GET['rows'] ?>/<?= $_GET['category_id'] ?>.htm">次のページ≫</a> <? } ?></span></td> </tr> </table> どなたかお分かりになられる方がいらっしゃいましたら是非とも 御教授いただけますと大変たすかります。 足りない点などございましたらご指摘いただけますと幸いです。 早急に追記、回答させていただきます。 何卒、よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
遅くなる原因は良く解らないのですが、 RewriteRule ^list/([0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+).htm$ /list.php?page=$1&rows=$2&category_id=$3&query=&sort=item_id+desc [QSA] と書くべきじゃないでしょうか。 また、勘ですがRewriteBaseは書かなくて良い気がします。 RewriteEngine on RewriteRule ^list/([0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+).htm$ list.php?page=$1&rows=$1&category_id=$1&query=&sort=item_id+desc [QSA] こんなのでいいんじゃないでしょうか
その他の回答 (2)
- tany180sx
- ベストアンサー率63% (239/379)
回答1と回答2を勝手に合わせると rows=$1 には 0 が入るので無限ループとなる、でFAですかね。 入力値をそのまま繰り返し構文に入れるのは危ないという結果です。 if ($rows > 0) など判定しないとね。
お礼
なるほど、やはりrows=$1 に 0 が入るのは 危険ですね。 該当箇所も修正するようにしました。 アドバイスいただきまして本当にありがとうございました!
- tany180sx
- ベストアンサー率63% (239/379)
単純に無限ループしているのでは? for ( $m = $s; $m <= $e; $m = $m + $_GET['rows']) {} $m は $s から $e までですけどインクリメントされる $_GET['rows'] が 0 と見なされると終わりませんよね。 一方、生の $_GET['rows'] が '0' (Stringになる) だと if ( $_GET['rows'] == '' ) $_GET['rows'] = 10; これは通らないので '0' のままとなります。 具体的な解決方法ではないですが参考までに。
お礼
分かりやすいご説明ありがとうございました! 結果私の単純なコードの書き方ミスのようでしたが、 参考にさせていただきます。誠にありがとうございます。 本当に皆さんありがとうございました。
お礼
お教えいただきまして誠にありがとうございました。 おっしゃるとおりでした。 単純なミスで誠に申し訳ありません。 お教えいただいたコードで書くと、正常に遷移できるようになりました。 本当にありがとうございました。