.htaccessのmod_rewriteの質問です。

リダイレクト・正規表現を使うと思います。


http://www.hoge.com/54343.html
のようなディレクトリ配下のhtmlへのアクセスを全て
http://www.hoge.com/index.php
に飛ばしたいと思います。
htmlのファイル名は全て数字です

その場合のmod_rewriteの書き方を教えてください。

Redirect permanent /(.*).html http://www.hoge.com/index.php
これではうまくいきませんでした。


また、できれば
http://www.hoge.com/sitemap.html
のみは
http://www.hoge.com/sitemap.php
に飛ばしたいです。

つまり、先ほどのリダイレクトは「数字.html」に限定させたいです。


どなたかよろしくお願いします。

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

ベストアンサー

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント65pt
RewriteEngine on
RewriteRule sitemap.html sitemap.php [L]
RewriteRule [0-9]+.html http://www.hoge.com/index.php [L]

ルールは上から順に比較され、

一番最初に当てはまった行に書かれているルールに従ってリダイレクトされます。

従って

RewriteEngine on
RewriteRule sitemap.html sitemap.php [L]
RewriteRule *.* http://www.hoge.com/index.php [L]

なんて事も・・・

id:tokyosmash

なぜか500になってしまうので色々と試してみると

RewriteRule [0-9]+.html index.php [L]

これでうまくいきました。Redirectの場合はhttpから、Rewriteの場合はトップディレクトリから書く決まりなのでしょうか。


>RewriteRule *.* http://www.hoge.com/index.php [L]

これはとても便利ですね!

全部のファイルを指定しなくてもいいのは便利です。勉強になりました。

情報ありがとうございました。

2007/08/04 05:35:01

その他の回答2件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301ここでベストアンサー

ポイント65pt
RewriteEngine on
RewriteRule sitemap.html sitemap.php [L]
RewriteRule [0-9]+.html http://www.hoge.com/index.php [L]

ルールは上から順に比較され、

一番最初に当てはまった行に書かれているルールに従ってリダイレクトされます。

従って

RewriteEngine on
RewriteRule sitemap.html sitemap.php [L]
RewriteRule *.* http://www.hoge.com/index.php [L]

なんて事も・・・

id:tokyosmash

なぜか500になってしまうので色々と試してみると

RewriteRule [0-9]+.html index.php [L]

これでうまくいきました。Redirectの場合はhttpから、Rewriteの場合はトップディレクトリから書く決まりなのでしょうか。


>RewriteRule *.* http://www.hoge.com/index.php [L]

これはとても便利ですね!

全部のファイルを指定しなくてもいいのは便利です。勉強になりました。

情報ありがとうございました。

2007/08/04 05:35:01
id:Yota No.2

回答回数453ベストアンサー獲得回数28

id:tokyosmash

ありがとうございます。参考にさせて頂きます。

2007/08/04 08:35:13
  • id:kn1967
    RewriteRule [0-9]+.html http://www.hoge.com/index.php [L]

    RewriteRule \d+.html index.php [L]
    のほうが短くてよかったですね。


    ところで質問は
    mod_rewrite(回答1)ですよね?
    mod_alias(回答2)だったのでしょうか?
  • id:tokyosmash
    コメントありがとうございます。

    >RewriteRule \d+.html index.php [L]
    この書き方は初めて見たのですが、まだうまくいっていません。500エラーになってしまいます。もうちょっと試行錯誤してみます。


    >mod_rewrite(回答1)ですよね?
    >mod_alias(回答2)だったのでしょうか?
    mod_aliasは初めて聞く名前でした。ちょっと調べてみたところ、どちらもリダイレクトはできるようですが、GETで得たパラメータでURLマッピングする場合はmod_rewriteしかできないと解釈しました。

    ですので、一応mod_rewriteの質問という事になります。
  • id:tokyosmash
    最近質問の閉じ忘れが多いので、今のうちに閉じさせていただきます。ポイント分配できないとまずいので。


    mod_rewriteや正規表現が苦手なのでまた質問させていただくかもしれません。よろしくお願い致します。
  • id:kn1967
    Redirect permanent は mod_alias のディレクティブで
    RewriteRule は mod_rewrite のディレクティブ。

    質問文の冒頭でmod_rewriteと書いておられるのに
    本文内ではRedirect permanentを使っておられるので
    これは「どこかで話がごちゃごちゃになっているのではないか?」と思い、コメントしました。

    以下、訂正です。
    \d+ は誤りです。このような表現は使えません。
    (permanentでは正規表現が使えますがRewriteRuleは[0-9]+ぐらいしか使えません。)
    httpは外部へのリダイレクトの場合に使いますので今回は不要でした。
    以上2点、お手数かけてスミマセンでした。
  • id:tokyosmash
    kn1967さんコメントありがとうございます。

    >Redirect permanent は mod_alias
    >RewriteRule は mod_rewrite

    確かに混同していました。混同というよりmod_aliasという言葉を知りませんでした。

    サイト内のリンク構造が変わったときにRedirect permanentを使っていて、GET情報を静的URL化する際にRewriteRuleを使っています。同じhtaccess内に書いているので混同していました。すみませんでした。

    何度もありがとうございます、おかげさまで勉強になりました。今後ともよろしくお願いします。

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

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

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

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