ApacheウェブサーバーのhtaccessでRewriteEngineを使用し、リダイレクトを行いたいと思っています。


以下のような連番(桁数は4桁固定)+英数ランダム文字列のフォルダ名があります。

test/0001abc012/
test/0002def345/
test/0003hij678/

連番のみ取り出し、以下のようにリダイレクトしたいです。

test/0001/
test/0002/
test/0003/

RewriteRuleをどのように記述すれば良いでしょうか?
もしくは、一度PHPなどで処理しなければならないのでしょうか?

お教えください。

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

回答2件)

id:pacochi No.1

回答回数247ベストアンサー獲得回数113

ポイント50pt

test ディレクトリに置くならこんな感じです。

RewriteEngine on
RewriteRule ^([0-9]{4})[0-9a-z]+/(.*) /test/$1/$2 [R,L]

うまくリダイレクトされなかったら、「/test/$1/」の部分を「http://サイトのドメイン/test/$1/」のように記述するとうまくいくかもしれません。

id:y-kawaz No.2

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

ポイント50pt

test/0001/ test/0002/ test/0003/ は実在していて、質問の言葉通り捉えるなら、

以下のような test/.htaccess を書けば良いと思います。

RewriteEngine on
RewriteRule ^([0-9]{4}) /test/$1/ [R,L]

ですが、test/0001/ test/0002/ test/0003/ は実在しないんだけど test/0001/ にアクセスされたら、実在する test/0001abc012/ を探して表示したいのだとするとプログラムが必要になります。

例えば test/search.php を以下のように作成して

<?php
$prefix = $_GET['prefix'];
if($prefix != '') {
  if($dir = opendir(".")) {
    $match = null;
    while(($file = readdir($dir)) !== false) {
      if(strpos($file, $prefix) === 0) {
        $match = $file;
        break;
      }
    }
    closedir($dir);
    if($match !== null) {
      header("Location: " . dirname($_SERVER['SCRIPT_NAME']) . "/$match");
      exit;
    }
  }
}

test/.htaccess を以下のように作成すれば

RewriteEngine on
RewriteRule ^([0-9]{4})/?$ search.php?prefix=$1 [L]

/test/0001/ にアクセスされたら test/0001abc012/ を探してリダイレクトしてくれるようには出来ます。

これが更にURLは test/0001/ のままで test/0001abc012/ の内容を表示したいとなると難しく、 RewriteMapというのを使えば可能ですが、この場合.htaccessではなくhttpd.confの設定+search.phpに代わる常駐プログラムが必要になります。


質問者さんが本当にやりたいのはどれれしょうか?

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

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

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

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

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