.htaccessでのリダイレクトの質問です。


http://www.hoge.com/web/list.php?pCon=wcat&Cat=%E6%AD%A3%E6%9C%88

上記のようなURLだったのですが、パラメーターを追加したことによりURLが変わってしまいました。
wcat1=wが追加されたのです。
以下のページへリダイレクトしたいのですが、動的ページですので正規表現を使ってリダイレクトできないものでしょうか?
http://www.hoge.com/web/list.php?wcat1=w&pCon=wcat&Cat=%E6%AD%A3%E6%9C%88



また、以下の場合はどうなるでしょう?
http://www.hoge.com/word/category.php?wcat1=0&wcat2=0&wcat3=0&Cat=%E6%99%AE%E9%80%9A

http://www.hoge.com/word/category.php?wcat1=w&wcat2=0&wcat3=0&Cat=%E6%99%AE%E9%80%9A
パラメーターwcat1の後が一文字変わっただけです。



正規表現の書き方がわからないのです。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/12/23 21:22:52
  • 終了:2007/12/26 04:11:58

回答(3件)

id:y-kawaz No.1

y-kawaz回答回数1420ベストアンサー獲得回数2252007/12/23 22:12:35

ポイント30pt

前者

RewriteRule (.*) $1?wcat1=w [QSA]

後者

RewriteRule (.*)wcat=0(.*) $1wcat1=w$2

凄くシンプルに書くとこんな感じでしょうか。

前者はパラメータを追加するだけなので QSA フラグを使うと簡単に書けます。このフラグの使い方に関してはぐぐればわかりやすく説明しているページは見つかります。

後者は、wcatが0以外のケースがある場合や、xwcat といった wcat で終わる別のパラメータがある場合は少し修正がいるでしょうが、これで十分であればそのまま使えると思います。

id:seadwell

早速のご回答ありがとうございます。

QSAに関して調べてみます。

2007/12/23 22:17:27
id:nandedarou No.2

nandedarou回答回数230ベストアンサー獲得回数342007/12/23 22:41:38

ポイント20pt

●1つ目のご質問のケース

.htaccessに次のように書いてはどうでしょうか

※list.phpがあるディレクトリ(フォルダ)に.htaccessがあり、それに書く場合です。

※下記の「QSA」は、クエリ文字列(「?」以降の文字列)を付け足すことを意味します。

RewriteEngine on
RewriteRule ^list.php$ list.php?wcat1=w [QSA,L]

 

●2つ目のご質問のケース

※mod_rewriteで、クエリ文字列の内容を書き換えることができないようです。

(↑違ったらごめんなさい)

そこで、category.phpの最初に次のように書いてはどうでしょうか?

if($_GET['wcat1']==='0'){
  $_GET['wcat1']='w';
}
id:nandedarou No.3

nandedarou回答回数230ベストアンサー獲得回数342007/12/24 00:24:12

ポイント100pt

2つ目の質問についての回答で、mod_rewriteではできないようだと書きましたが、次のようにすれば、リライトできます。(以前、考えたのを思い出しました。)

※以下は、category.phpの入っているディレクトリにある.htaccessに書く場合です。

RewriteEngine on
RewriteRule ^category\.php$ category.php%{QUERY_STRING}
RewriteRule ^category\.php(.*)wcat=0(.*)$ category.php?$1wcat=w$2 [L]

解説します。

RewriteRuleは、URLの「?」以降を切り取って、正規表現によるマッチングを行います。

URLの「?」以降(「?」は含みません)は、%{QUERY_STRING}に代入されています。

このままだと、「?」以降の文字列を正規表現でマッチングできません。

そこで、2行目でクエリ文字列を付加しています。

この段階で、最初のURLから、「?」だけ除去された形になります。

3行目で、クエリ文字列部分の「wcat=0」を「wcat=w」に書き換えて、「?」を付加しています。

id:seadwell

コメントに渡る細かくご丁寧なご回答ありがとうございます。

http://q.hatena.ne.jp/1193484906の前回もコメントいただいていたのですね。

まことに恐縮なのですが、コメントに気付いていませんでした><

申し訳ありませんm(_ _)m

レンタルサーバー(Xサーバー)より、『PHPの仕様によりご希望には添えません』なる返事をが来ましたので、ではいろんなWEBに書いてあることや、実際、クエリがあるはずなのに静的ページに見えているのはなんなんだろう???

と頭をひねりながら、よく解らないまま放置していました・・・。

今度は、私なりに教えていただいたことを基本にいろいろトライしてみます。

ありがとうございました^^/

2007/12/26 04:11:01
  • id:nandedarou
    私の回答の一部を訂正します。
    1つ目の「.」の前に「\」を入れてください。
    ※「\」は、Windows上では半角の「¥」です。(「¥」キーを押して表示される文字です。)
    ※2つ目の「.」は、そのままにしといて下さい。
  • id:nandedarou
    ●以前のご質問(http://q.hatena.ne.jp/1193484906)をみました。それに対する私なりの回答をコメントで書いて見ましたので、よろしければ参考にして下さい。


    ●また、これを見てわかったのですが、お使いのサーバでは、RewriteRuleの記述の際、「/」が必要なようですね。
    申し訳ありませんが、私の書いた回答のRewriteRuleの2つの引数に「/」を入れて下さい。

    RewriteRule ^引数1$ 引数2
           ↓    ↓
    RewriteRule ^/引数1$ /引数2

    ●あやふやなのですが、2つ目の回答において、
    「wcat1」と書くべきところを「wcat」と書いてしまったかも知れません。
    もし、そうだったら、「1」を付けて下さい。
  • id:seadwell
    PHPを合わせ使うことは考えもしませんでした。
    よく解る解説で感謝しています。
    また、回答3などすばらしい回答です。

    前回の質問に頂いたコメントで
    > そもそも
    http://www.hoge.com/worddetail.php?tag=%E5%B1%B1%E6%9C%AC%E6%A2%93
    というアクセスをしないように設計すべきだと思います。

    全くそのとおりですね。
    前回の問題もコメントを読めば納得です。


    ホントに感謝感謝です。
    ありがとうございました。

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

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

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

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