人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Apacheのmod_rewriteについてお聞きします。

現在、.htaccessに以下のように記述してhoge.phpというスクリプトを動的に出力することに成功しております。

RewriteEngine On
RewriteBase /
RewriteRule ^([0-9A-Za-z]+)\.html$ hoge.php?page=$1 [L]

この設定によって、例えば、123.htmlにアクセスするとhoge.php?page=123にアクセスしたのと同じように見せかけることができています。

ただ、当然ながら、このままでは123.htmlでもhoge.php?page=123でもアクセスできてしまいます。
SEOの観点から、同じページのURLが2つあることは好ましくないので、hoge.php?page=123のような動的URLへのアクセスを、^123.htmlにリダイレクトしたいと考えています。
そこで、下記の一行を追記しました。

RewriteRule ^([0-9A-Za-z]+)\.html$ hoge.php?page=$1 [R=301,L]

これで動的URLを静的に書きかえたURLへリダイレクトしてくれると思ったのですが、動作せず、hoge.php?page=1でもアクセスできてしまいます。
下記のように正規表現を使わずに書いても同じ結果でした。

RewriteRule ^hoge.php?page=123$ 123.html [R=301,L]

解決法をご教授お願いします。

●質問者: hardboiled243
●カテゴリ:インターネット ウェブ制作
✍キーワード:.htaccess Apache hoge HTML mod_rewrite
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● zaxaxaz
●80ポイント ベストアンサー
RewriteRule ^hoge.php?page=123$ 123.html [R=301,L]

上記のようにクエリを含めたリライトはできないと思います。

(クエリの引き継ぎは [QSA] でできますが書き換えはできない。)


こういった場合、PHP側で処理するのが一般的なやり方かと思います。

例えば、こんな感じになります。

RewriteEngine On
RewriteBase /
RewriteRule ^([0-9A-Za-z]+)\.html$ hoge.php?page=$1 [L]
<?php
if (stripos($_SERVER['REQUEST_URI'], 'hoge.php') !== FALSE && isset($_GET['page']) && preg_match('/^([0-9A-Z])+$/i', $_GET['page'], $matches)) {
 header('HTTP/1.1 301 Moved Permanently');
 header('Location: http://example.com/' . $matches[1] . '.html');
}

/* 処理 */
?>

(REQUEST_URIを見て、index.phpでアクセスされた場合以外はリダイレクトしています。)

◎質問者からの返答

ありがとうございます。参考なりました。

ご教授いただいたPHPでHTTPヘッダーを出力する方式で対処したいと思います。

またよろしくお願いします。


2 ● きなもち
●0ポイント

tgbzksrm。hs


3 ● wwwww1
●0ポイント

わかるよ


4 ● baron
●10ポイント

RewriteRule ^hoge.php?page=([0-9a-zA-Z]+)$ $1.html [R=301,L]

こんなもんでしょうか。

ちなみにmod_rewriteについては詳しくありません。

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ