1つのページに3つのリンクがあり、

http://www.hogehoge.com/test1/jirei_search/mansion/
http://www.hogehoge.com/test1/jirei_search/mansion/01/
http://www.hogehoge.com/test1/jirei_search/mansion/02/03/
と、mansionをパラメーターとして渡す場合と
mansionと01を渡す場合
mansionと02と03を渡す場合
で.htaccessでmod_rewriteをためしていますが、
3つパラメーターをわたすのがどうしてもうまくいきません。
ソースはこのように書きました。

DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([0-9A-Za-z]+)\.html$ index.php?id1=$1 [L]
RewriteRule ^/test1/jirei_search$ /test1/jirei_searh/ [L]

RewriteRule ^([^/]+)/$ index.php?id1=$1

RewriteRule ^([^/]+)/([^/]+)/$ index.php?id1=$1&id2=$2
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ index.php?id1=$1&id2=$2id3=$3 [L]

http://www.hogehoge.com/test1/jirei_search/mansion/02/03/

へのアクセスで
jirei_searchの中にある.index.phpに3つ以上のパラメータをわたすにはどうしたらよいのでしょうか?4つ5つとわたしてみたいとおもったいるのですが。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/11/13 19:46:17
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:wizemperor No.1

回答回数379ベストアンサー獲得回数52

ポイント100pt

test1/jirei_search/の後に再度リライトすることを前提にしているみたいですが、

Lフラグの付け方がおかしいように思います。

わかりやすく書き直してみました。

DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# /mansion.html -> /test1/jirei_search/mansion/
RewriteRule ^([0-9A-Za-z]+)\.html$ test1/jirei_search/$1/

# /test1/jirei_search/mansion/
RewriteRule ^test1/jirei_searh/([^/]+)/$ index.php?id1=$1 [L]

# /test1/jirei_search/mansion/01/
RewriteRule ^test1/jirei_searh/([^/]+)/([^/]+)/$ index.php?id1=$1&id2=$2 [L]

# /test1/jirei_search/mansion/01/02/
RewriteRule ^test1/jirei_searh/([^/]+)/([^/]+)/([^/]+)/$ index.php?id1=$1&id2=$2id3=$3 [L]

これだと、パラメータが増えると書き足しが大変なので、

さらにパラメータを増やす可能性がある場合は、PHP側で処理(ルーティング)したほうがいいかもしれません。

id:zap50326

ありがとうございます。ためしてみたのですが、すべて404エラーがでてしまいます。たしかに^test1から書くほうが適切な気がするのですが、あると動かない理由がわかりません。

2007/11/13 09:41:17

その他の回答1件)

id:wizemperor No.1

回答回数379ベストアンサー獲得回数52ここでベストアンサー

ポイント100pt

test1/jirei_search/の後に再度リライトすることを前提にしているみたいですが、

Lフラグの付け方がおかしいように思います。

わかりやすく書き直してみました。

DirectoryIndex index.php
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# /mansion.html -> /test1/jirei_search/mansion/
RewriteRule ^([0-9A-Za-z]+)\.html$ test1/jirei_search/$1/

# /test1/jirei_search/mansion/
RewriteRule ^test1/jirei_searh/([^/]+)/$ index.php?id1=$1 [L]

# /test1/jirei_search/mansion/01/
RewriteRule ^test1/jirei_searh/([^/]+)/([^/]+)/$ index.php?id1=$1&id2=$2 [L]

# /test1/jirei_search/mansion/01/02/
RewriteRule ^test1/jirei_searh/([^/]+)/([^/]+)/([^/]+)/$ index.php?id1=$1&id2=$2id3=$3 [L]

これだと、パラメータが増えると書き足しが大変なので、

さらにパラメータを増やす可能性がある場合は、PHP側で処理(ルーティング)したほうがいいかもしれません。

id:zap50326

ありがとうございます。ためしてみたのですが、すべて404エラーがでてしまいます。たしかに^test1から書くほうが適切な気がするのですが、あると動かない理由がわかりません。

2007/11/13 09:41:17
id:tomcat_a88 No.2

回答回数48ベストアンサー獲得回数3

見ていて思いついた程度の回答なので、ポイントは結構です。

 

#私も最近、mod_rewrite で苦戦しています・・・

 

これだと、2件目以降がマッチしないような?

ここのところは、

> RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ index.php?id1=$1&id2=$2id3=$3 [L]

RewriteRule ^([^/]+)/(.*)/(.*)/$ index.php?id1=$1&id2=$2id3=$3 [L]

という感じでいきませんでしょうか。

2件目以降のところ

/([^/]+)/

となっていると スラッシュが出現した後、スラッシュから始まった文字 という検索になるので、

/test1/jirei_search/mansion/02//03/ という形じゃないとマッチしないような気がします。

id:zap50326

そういわれると、不安になりますが、たしか()の中の[^/]はスラッシュ以外ではなかったかと。

2007/11/13 19:43:07
  • id:wizemperor
    すみません。
    回答の中に「jirei_searh」になってしまっている部分がありました。
    「jirei_search」に直してもだめでしょうか?
  • id:zap50326
    ありがとうございました。格闘した結果うまくうごきました。
    カテゴリのトップページがtest1というフォルダにしてましたが、.htaccessはjirei_searchにあったのでうまく行かなかった模様です。下記ソースパスにtest1をつけくわえるとやはり動かなくなります。教えていただいたとおり、パラメーターを増やす場合はPHP側の処理にしようかと思います。しかしながら本当に難しかったです。最終がこのようなソースです。
    DirectoryIndex index.php
    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # RewriteRule ^jirei_search/([0-9A-Za-z]+)\.html$ jirei_search/index.php?id1=$1 [L]
    RewriteRule ^jirei_search/([0-9A-Za-z]+)\.html$ jirei_search/$1/ [L]
    # RewriteRule ^jirei_search/([^/]+)/$ jirei_search/$1 [L]
    RewriteRule ^jirei_search/([^/]+)/$ jirei_search/index.php?id=$1 [L]
    RewriteRule ^jirei_search/([^/]+)/([^/]+)/$ jirei_search/index.php?id1=$1&id2=$2 [L]
    RewriteRule ^jirei_search/([^/]+)/([^/]+)/([^/]+)/$ jirei_search/index.php?id1=$1&id2=$2&id3=$
    3 [L]
    RewriteRule ^jirei_search/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ jirei_search/index.php?id1=$1&id2=
    $2&id3=$3&id4=$4 [L]
  • id:wizemperor
    なるほど、.htaccessはjirei_searchにあったのですね。
    www.hogehoge.com/にあるものとして書いていました。

    RewriteRuleは、RewriteBaseを指定していない場合は.htaccessがある場所が基準になるので、
    test1をつけるとうまくいかなかないのはそういうことだったようですね。
    直接の回答にはならず申し訳なかったですが、微力ながらお役に立てたのなら幸いです。

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

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

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

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