rewriteruleについて教えて下さい。


http://www.hoge.com/p-123/
http://www.hoge.com/products_info.php?products_id=123
にRewriteするには、どのように記述すればいいのでしょうか?

RewriteRule ^(.*)p-(.*)/$ /products_info.php?products_id=$2&%(QUERY_STRING)

これではだめでした。
何がいけないでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2008/04/22 01:00:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント35pt

ドメイン名まで含もうとしている点が間違っているのと、正規表現が曖昧です。それから、QUERY_STRINGの目的が分かりません。

修正するとしたら、

RewriteRule  ^/p-([0-9]+)/$  /products_info.php?products_id=$1

という感じではないでしょうか。


参考サイト

id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント35pt

元のクエリパラメータも残したいということでしょうか?

でしたらQSAオプションが使えると思いますよ。

RewriteRule ^/?p-(.*)/ /products_info.php?products_id=$1 [QSA,L]

QSAが付いていると、元のクエリパラメータに足した形にしてくれます。

例えば /p-123/?foo=bar は /products_info.php?products_id=$1&foo=bar と言う感じに ? や & のどっちを付けるかも判断して上手く繋げてくれます。

また元のルールではクエリ文字列も後ろにつけようとしているようですが /$ と言う風に行末/を指定してしまっている為クエリ文字列がマッチする余地を奪ってしまっています。なので行末$は除きました。

あと頭の.*が不要に思えましたのでhttpd.confか.htaccessのどちらでも使えると思われるように修正してみました。

動作確認はしてませんが多分大丈夫だと思います(^^;

http://q.hatena.ne.jp/answer

id:tezcello No.3

回答回数460ベストアンサー獲得回数69

ポイント10pt

> これではだめでした。

特にエラーは出ないので、思ったように動作していないという事だと思います。

「思ったような動作」が何なのか分からないので、想像で書きます。

どのようにダメだったのかをお書きになると、的確な回答が早く集まると思います。

(後、コメント欄もあけておいて頂けると、状況確認とか回答のフォローができるのでありがたいです。...ポイントも不要ですし...)


%(QUERY_STRING) という文字列を渡したいのではなく、

http://www.hoge.com/p-123/?abc=123

のようなクエリ部分(abc=123)も渡したいのなら、

&%(QUERY_STRING) の部分は、&%{QUERY_STRING} の間違いでしょう。( )では無く、{ }です。


http://www.hoge.com/p-123/ だけではなく、http://www.hoge.com/pop-123/ まで書き換えをしてしまうのが問題ならば、ルールの ^(.*)p-(.*)/$ 部分を ^p-(.*)/$ とすればよいでしょう。

.htaccess に記述する場合は、mod_rewrite には RewriteRule を書いている所以下の値しか渡されないでしょうから、p の前に / は不要だと思います。


Not Found になってしまうのなら、いくつか可能性があります。

サイトのルートに products_info.php も .htaccess もあるのならチャンと動くと思うので、下位のディレクトリに設置していませんか?

そうなら、置き換え後のアドレスが /products_info.php のように / で始まっていると、そのサイトのルートになければいけません。

RewriteBase を指定し、置き換え後のアドレスの先頭の / を削除する事で解決できるのではと思います。


ブラウザでアクセスする際に、http://www.hoge.com/p-123/ を、http://www.hoge.com/p-123 としていませんよね?

RewriteRule で、末尾に / が付く事を規定しているので、/ が付いていないものは、パターンが一致したとは見なされないでしょう。

同様に、http://intra/~cadcam/hate/p-123?abc=123 や、http://intra/~cadcam/hate/p-123?abc=123/ も一致しないはずです。

アクセスそのものをルール通りにすればいいのですが、ひょっとして前述の様にクエリを渡したいのかも知れませんね。

この場合は、パターンの部分を、^(.*)p-(.*)/$ から、^(.*)p-(.*)$ に変更すればよい様です。

残念ながら、うちの環境では、#2さんの ^(.*)p-(.*)/ は、うまくいきませんでした。


もしも、Internal Server Error となっているのなら、.htaccess ファイルの(この書き換え以外の部分も含めて)どこかに記述ミスがあります。


http://httpd.apache.org/docs/2.1/ja/mod/mod_rewrite.html#rewrite...

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

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

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

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

回答リクエストを送信したユーザーはいません