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]

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

回答の条件
  • 1人5回まで
  • 登録:2010/05/28 00:41:50
  • 終了:2010/05/29 00:41:42

ベストアンサー

id:zaxaxaz No.1

zaxaxaz回答回数13ベストアンサー獲得回数32010/05/28 08:26:50

ポイント80pt
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でアクセスされた場合以外はリダイレクトしています。)

id:hardboiled243

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

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

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

2010/05/29 00:39:05

その他の回答(3件)

id:zaxaxaz No.1

zaxaxaz回答回数13ベストアンサー獲得回数32010/05/28 08:26:50ここでベストアンサー

ポイント80pt
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でアクセスされた場合以外はリダイレクトしています。)

id:hardboiled243

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

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

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

2010/05/29 00:39:05
id:kinamoti-kinakomoti No.2

きなもち回答回数14ベストアンサー獲得回数02010/05/28 15:19:57

tgbzksrm。hs

id:wwwww1 No.3

wwwww1回答回数63ベストアンサー獲得回数02010/05/28 16:06:28

わかるよ

id:baron2 No.4

baron回答回数23ベストアンサー獲得回数52010/05/28 21:33:46

ポイント10pt

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

こんなもんでしょうか。

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

id:hardboiled243

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

2010/05/29 00:35:40
  • id:ken3memo
    >SEOの観点から、同じページのURLが2つあることは好ましくないので
    少し視点が違う話なのでコメントで
    Google ウェブマスター ツール( https://www.google.com/webmasters/tools/ )を使用してパラメーターの設定を行うと、>クロールの効率が高まり、URL の重複が減る<らしいけど、私が少し前設定した場合( http://d.hatena.ne.jp/ken3memo/20100528/1274998423 )は、逆効果でした※違う要因もあると思うけど。
    スマートな良い回答が付くことを私も期待してます。

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

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

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

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