mod_rewriteを用いて、動的に生成されたURLを携帯用のURLに変換してジャンプさせたいと考えています。

正規表現を使うことは分かったのです、正規表現に疎く、書き方でつまずいています。
.htaccessにどのように記載したらよいのでしょうか。お知恵をお借りできれば幸いです。
※変更箇所2箇所のみです。1)shop.cgi→k_shop.cgi 2)&mode=p_wide→&mode=detail
▼変更前
http://www.example.com/shop/shop.cgi?order=&class=&keyword=&FF=&price_sort=&pic_only=&mode=p_wide&id=210&superkey=1
▼変更後
http://www.example.com/shop/k_shop.cgi?order=&mode=detail&id=210

回答の条件
  • 1人10回まで
  • 登録:2007/03/06 13:00:52
  • 終了:2007/03/07 16:52:13

回答(4件)

id:nandedarou No.1

nandedarou回答回数230ベストアンサー獲得回数342007/03/06 15:07:52

ポイント70pt

「変更前」のURLとして書かれている部分で、アクセスする度に変化する可能性があるのは、「210」だけでしょうか?そうだとすると、次のように書けばよいと思います。

RewriteEngine on

RewriteRule ^shop/shop.cgi?order=&class=&keyword=&FF=&price_sort=&pic_only=&mode=p_wide&id=(.*)&superkey=1/$ shop/k_shop.cgi?order=&mode=detail&id=$1 [L]

※変換前の「(.*)」の位置にある文字列や数字が、変換後の「$1」に代入されます。

id:icta

文字制限で書ききれなかったのですが、「&class=&keyword=&FF=&price_sort=&pic_only=」と「&superkey=1」はアクセスする度に値が入ったりして変化する可能性があります。この場合はどのようにしたらよいでしょうか?

2007/03/06 15:24:17
id:nandedarou No.2

nandedarou回答回数230ベストアンサー獲得回数342007/03/06 15:45:07

ポイント70pt

id以外は、変換後のアドレスに反映させなくてよいのでしょうか?

そうならば、変化する可能性のある部分に「.*」を書いて下さい。

RewriteEngine on

RewriteRule ^shop/shop.cgi?order=&class=.*&keyword=.*&FF=.*&price_sort=.*&pic_only=.*&mode=p_wide&id=(.*)&superkey=.*/$ shop/k_shop.cgi?order=&mode=detail&id=$1 [L]

※変換後のアドレスに代入したい部分は、「.*」ではなく、「(.*)」にして下さい。変換前のアドレス中()で括った部分は、前から順に変換後のアドレスの$1,$2,$3…に代入されます。

id:nandedarou No.3

nandedarou回答回数230ベストアンサー獲得回数342007/03/06 15:46:34

ポイント70pt

id以外は、変換後のアドレスに反映させなくてよいのでしょうか?

そうならば、変化する可能性のある部分に「.*」を書いて下さい。

RewriteEngine on

RewriteRule ^shop/shop.cgi?order=&class=.*&keyword=.*&FF=.*&price_sort=.*&pic_only=.*&mode=p_wide&id=(.*)&superkey=.*/$ shop/k_shop.cgi?order=&mode=detail&id=$1 [L]

※変換後のアドレスに代入したい部分は、「.*」ではなく、「(.*)」にして下さい。変換前のアドレス中()で括った部分は、前から順に変換後のアドレスの$1,$2,$3…に代入されます。

id:icta

id以外は、変換後のアドレスに反映しません。

教えていただいたとおりに記載したのですが、うまく変換しません。予約語に¥をつけてみましたが同様でした。

▼以下は質問前に記載していた内容です。この場合だとk_shop.cgiには書き換わります。

RewriteRuleに正規表現をいろいろ追加してみたのですがどれも駄目でした。

そもそも以下の書き方に問題があるのではないかと疑っています。

何か間違いがありましたら教えていただけませんでしょうか。よろしくお願いします。

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} ^DoCoMo

RewriteCond %{REQUEST_FILENAME} shop/shop

RewriteRule shop/shop\.cgi$ http://www.example.com/shop/k_shop\.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^vodafone

RewriteCond %{REQUEST_FILENAME} shop/shop

RewriteRule shop/shop\.cgi$ http://www.example.com/shop/k_shop\.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^KDDI

RewriteCond %{REQUEST_FILENAME} shop/shop

RewriteRule shop/shop\.cgi$ http://www.example.com/shop/k_shop\.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^J-PHONE

RewriteCond %{REQUEST_FILENAME} shop/shop

RewriteRule shop/shop\.cgi$ http://www.example.com/shop/k_shop\.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^Up.Browser

RewriteCond %{REQUEST_FILENAME} shop/shop

RewriteRule shop/shop\.cgi$ http://www.example.com/shop/k_shop\.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^ASTEL

RewriteCond %{REQUEST_FILENAME} shop/shop

RewriteRule shop/shop\.cgi$ http://www.example.com/shop/k_shop\.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^DDIPOCKET

RewriteCond %{REQUEST_FILENAME} shop/shop

RewriteRule shop/shop\.cgi$ http://www.example.com/shop/k_shop\.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^DoCoMo

RewriteRule ^$ http://www.example.com/m/index.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^vodafone

RewriteRule ^$ http://www.example.com/m/index.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^KDDI

RewriteRule ^$ http://www.example.com/m/index.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^J-PHONE

RewriteRule ^$ http://www.example.com/m/index.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^Up.Browser

RewriteRule ^$ http://www.example.com/m/index.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^ASTEL

RewriteRule ^$ http://www.example.com/m/index.cgi [R]

RewriteCond %{HTTP_USER_AGENT} ^DDIPOCKET

RewriteRule ^$ http://www.example.com/m/index.cgi [L]

2007/03/07 00:06:58
id:nandedarou No.4

nandedarou回答回数230ベストアンサー獲得回数342007/03/07 01:24:10

ポイント70pt

なんとか、うまくいく方法を見つけました。

そのままコピーして、.htaccessに貼り付け、その.htaccessを、shopフォルダに置いて下さい

(※shopフォルダより1つ上位のフォルダにおく場合は、4箇所に

「shop/」と書く必要があります。どこかわからない場合は聞いて下さい。)

RewriteEngine on

RewriteRule ^shop.cgi %{QUERY_STRING}

RewriteRule ^.*&mode=p_wide&id=([^&]*).*$ k_shop.cgi?order=&mode=detail&id=$1 [L]

※回答欄に書くほどのことではない追加情報は、このページ下の「この質問・回答へのコメント」に書きますので、見て下さい。

id:icta

希望通りに動作いたしました。

1週間近く悩んでいたので解決できて大変うれしいです。

丁寧に教えていただき本当にありがとうございました。

2007/03/07 16:50:10
  • id:nandedarou
    さらに実験をしたところ、もっといい書き方がわかりました。

    RewriteEngine on
    RewriteRule ^shop\.cgi$ shop.cgi%{QUERY_STRING}
    RewriteRule ^shop\.cgi.*mode=p_wide.*&id=([^&]*).*$ k_shop.cgi?order=&mode=detail&id=$1
    RewriteRule ^shop\.cgi.*id=([^&]*).*&mode=p_wide.*$ k_shop.cgi?order=&mode=detail&id=$1 [L]

    ※「~cgi$」という風に$があると、クエリー文字列(?以降)があるとマッチしないと思っていましたが、実際はマッチしました。つまり、RewriteEngineによって、RewriteRule適用前に、?以降をカットして、%{QUERY_STRING}に代入しているようです。

    ※2行目は、?をカットして次の行に渡す処理です。
    ※4行目は、modeとidの順番が逆でも、マッチするように、書きました。

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

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

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

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