現在、.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]
解決法をご教授お願いします。
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でアクセスされた場合以外はリダイレクトしています。)
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ヘッダーを出力する方式で対処したいと思います。
またよろしくお願いします。
RewriteRule ^hoge.php?page=([0-9a-zA-Z]+)$ $1.html [R=301,L]
こんなもんでしょうか。
ちなみにmod_rewriteについては詳しくありません。
ご回答ありがとうございました。
ありがとうございます。参考なりました。
ご教授いただいたPHPでHTTPヘッダーを出力する方式で対処したいと思います。
またよろしくお願いします。