人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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、正規表現共に知識が深いわけではありませんので、宜しくお願いします。

●質問者: dak
●カテゴリ:コンピュータ
✍キーワード:.htaccess INDEX M$ mod_rewrite ON
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● rev-9
●10ポイント

http://japache.infoscience.co.jp/rewriteguide/

Apache URL Rewriting Guide

ここの一番最初の例

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

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


2 ● english
●40ポイント

http://www.net-newbie.com/trans/mod_rewrite.html

Apache module mod_rewrite

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での処理も加えると楽になるかもしれません。

http://cgi.bookstudio.com/path_info/path_info3.htm

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

http://blog.su-jine.com/archives/2004/08/_path_info_1.html

Su-Jine の独り言

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ