.htaccessと正規表現の質問です。


a)のURLをb)でもアクセスできるようにするにはどのようにしたらよいでしょうか?
a)
http://example.com/shop/p_image/1p1.jpg
http://example.com/shop/more_img/08-46.jpg
http://example.com/shop/shop.cgi?class=all&keyword=&superkey=1&id=105&mode=p_wide

b)
http://example.com/shop/item/199/p_image/1p1.jpg
http://example.com/shop/item/6/more_img/08-46.jpg
http://example.com/shop/item/105/

http://example.com/shop/に以下のように.htaccessを置いてみました。
RewriteEngine on
RewriteRule item/(.*)/$ http://example.com/shop/shop.cgi?class=all&keyword=&superkey=1&id=$1&mode=p_wide
RewriteRule item/.*/(.*)$ http://example.com/shop/$1

3番目のhttp://example.com/shop/shop.cgi?class=all&keyword=&superkey=1&id=105&mode=p_wideに関してはhttp://example.com/shop/item/105/でアクセスできたのですが、残りのjpg画像がうまく行きません。
関係ないかもしれませんがサーバはsakura、OSはWinXPです。
どのように書けばよいか教えていただければ幸いです。

回答の条件
  • 1人3回まで
  • 登録:2008/09/28 13:37:38
  • 終了:2008/09/28 18:54:53

ベストアンサー

id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402008/09/28 14:55:05

ポイント100pt

なんか一部だけ出されてもよくわからんが、

RewriteEngine On
RewriteBase /shop/

RewriteRule item/[0-9]+/(.+\.jpe?g)$ $1 [L]
RewriteRule item/([0-9]+)/$ shop.cgi?class=all&keyword=&superkey=1&id=$1&mode=p_wide [L]

こんなの?

id:icta

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

質問の条件では希望通りの動作をしたのですが、今度は今まで問題なかった以下の部分が表示されなくなりました。

こちらの条件を追加するにはどうしたらよいのでしょうか?

a)のURLをb)のURLでもアクセスできるようにする。

a) http://example.com/shop/convert.cgi?src=./m_image/98.jpg&w=105&h...

b) http://example.com/shop/item/178/convert.cgi?src=./m_image/98.jp...

以下の1行を加えてみましたが動作しませんでした。

RewriteRule item/[0-9]+/(.+=)$ $1 [L]

お手すきの時に教えていただければ幸いです。

2008/09/28 16:20:03

その他の回答(1件)

id:y-kawaz No.1

y-kawaz回答回数1419ベストアンサー獲得回数2252008/09/28 13:58:33

ポイント10pt
RewriteRule item/.*/(.*)$ http://example.com/shop/$1

↑これを、↓こういう風に変えればいいと思います

RewriteRule item/.*?/(.*)$ http://example.com/shop/$1

元のパターンの問題点は http://example.com/shop/item/199/p_image/1p1.jpg を例に説明すると、

  • 最初の item/.*/ の部分が item/199/p_image/ という風に.*が最大限にマッチしてしまい、$1 には p_image/1p1.jpg が入って欲しいはずが 1p1.jpg しか入らなくなります。
  • 最初のの * を *? にしてやると最小限のマッチになるので item/.*?/ は item/199/ にマッチし、$1 には p_image/1p1.jpg が入り期待する結果が得られます。

あと、このままでも動きますが、RewriteRule の2番目の引数の http://example.com/shop/ の部分は不要だと思いますよ。

id:icta

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

早速試してみたのですが残念ながら404エラーとなってしまいました。

何か環境によって違うのか、それとも他のhtaccessが原因なのがよくわからないので調べてみます。

2008/09/28 15:53:34
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402008/09/28 14:55:05ここでベストアンサー

ポイント100pt

なんか一部だけ出されてもよくわからんが、

RewriteEngine On
RewriteBase /shop/

RewriteRule item/[0-9]+/(.+\.jpe?g)$ $1 [L]
RewriteRule item/([0-9]+)/$ shop.cgi?class=all&keyword=&superkey=1&id=$1&mode=p_wide [L]

こんなの?

id:icta

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

質問の条件では希望通りの動作をしたのですが、今度は今まで問題なかった以下の部分が表示されなくなりました。

こちらの条件を追加するにはどうしたらよいのでしょうか?

a)のURLをb)のURLでもアクセスできるようにする。

a) http://example.com/shop/convert.cgi?src=./m_image/98.jpg&w=105&h...

b) http://example.com/shop/item/178/convert.cgi?src=./m_image/98.jp...

以下の1行を加えてみましたが動作しませんでした。

RewriteRule item/[0-9]+/(.+=)$ $1 [L]

お手すきの時に教えていただければ幸いです。

2008/09/28 16:20:03
  • id:b-wind
    RewriteRule の最初に

    RewriteRule item/[0-9]+/convert\.cgi$ convert.cgi [L,QSA]

    とかやってみたら?

  • id:icta
    ご回答ありがとうございました。
    希望通りの動作を確認できました。
    本当に助かりました。

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

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

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

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