mod_rewriteを用いて静的URL=>動的URLへの変換を行う際、任意の数の引数を含むURLに対応するため、以下のように.htaccessに記述しましたが、意図した通り動作しません(引数が正しくない場合はトップページを表示する処理になっており、今のところトップページが表示される状況です)。何が原因でしょうか?

---------------------------------
DirectoryIndex index.php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule p-(.*)(/(.*)-(.*))*¥.htm$ /index.php?p=$1&$2=$3&$4=$5&$6=$7
---------------------------------
なお、上記のように汎用的な形でなく、固定的な引数を想定してRewriteRuleを記述した場合はきちんと動作します。.htaccess、正規表現共に知識が深いわけではありませんので、宜しくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/05/03 01:58:15
  • 終了:--

回答(2件)

id:rev-9 No.1

rev-9回答回数61ベストアンサー獲得回数82005/05/04 07:35:03

ポイント10pt

ここの一番最初の例

RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]

のように、「?」以降をすべて(.*)として扱えばOKでは?

id:english No.2

english回答回数304ベストアンサー獲得回数02005/05/03 09:25:28

ポイント40pt

URLはダミーです。


最終的な回答は出せないのですが、まず、

1.

RewriteRule p-(.*)(/(.*)-(.*))*¥.htm$ /index.php?p=$1&$2=$3&$4=$5&$6=$7

で想定しているURLの一例を示していただけませんか?


p-5/a-7/b-8/c.html の時に

index.php?p=5&a=7&b=8&c

でしょうか?


2.その想定しているファイル名でアクセスがあった場合に、実際にはindex.phpの引数は実際にはどうなっているのでしょうか?


index.php内で、トップページに李第零句とするのではなく、

print $REQUEST_URI;

exit;

などとして、実際にアクセスしているURLを確認してください。これは$1や$2、$3に何が入っているかを確認するためです。


3.別のやり方を考えてみてください。すべてをmod_rewriteで行おうとするのではなく、

p-5/a-8/b-7/c.html

というようなURLを割り当てずに、

/p-5_a-8_b-7_c-6.htm

にアクセスがあった場合に、

index_b.php?filename=p-5_a-8_b-7_c-6

にリダイレクトされるように、.htaccessに書きます。


その上で、index_b.phpで$filename=”p-5_a-8_b-7_c-6”;を調理するようにします。


簡単に書きます。hatenaのシステム上の都合によりダブルクォテーションが全角文字になっていると思いますが、半角に書き換えてください。

<?php

$filename = ”p_5_a-8_b-7_c-6”;

$url = ””; //index.phpの引数。初期化


$moji_array = explode(”_”,$filename);


$num = count($moji_array); //引数の数

for($i=0;$i<$num;$i++){

//さらにハイフンで分割

$arg_array = explode(”-”,$moji_array[$i]);

if($i == ($num -1)){

$url .= $arg_array[0] . ”=” . $arg_array[1];

} else {

$url .= $arg_array[0] . ”=” . $arg_array[1] . ”&”;

}

}

//print $url;


header(”location: http://www.example.com/index.php?$url”);

?>


実際には、$filenameが想定している形になっているかをチェックした上でindex.phpに転送したほうが良いですが、このようにすべてをmod_rewriteでやるのではなく、PHPでの処理も加えると楽になるかもしれません。

また、mod_rewriteをぜんぜん使わずに、PHPだけで、PATH_INFOを使って処理するのも手です。

こちらのページも参考になるかと思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません