- ベストアンサー
.htaccessで動的URLを静的化
- 動的URLを静的化する方法について検討されているようです。既存のURLがあるため、動的URLにアクセスがあった場合に静的URLにリダイレクトさせる方法を考えています。具体的なRewriteRuleの記述方法について教えてください。
- 既存のURLがインデックスされているため、動的URLを静的URLにリダイレクトさせる方法を探しています。いくつかの試みを行いましたが、望み通りのURL変換ができませんでした。RewriteRuleの適切な記述方法を教えてください。
- 現在、動的URLを静的URLに変換する方法を模索しています。既存のURLがあるため、動的URLにアクセスがあった場合に静的URLにリダイレクトさせる方法を探しています。RewriteRuleの使い方についてアドバイスをいただけると助かります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
一旦、 >パラメータの組み合わせパターンが色々あるため上記のようなルールで対応できない について、無視します。 なんとか組み合わせて、RewriteRuleに書きかえる事ができたとして、話を進めます。 そのうえで、やりたい事は ・動的URLを静的URLに変換して、移動しました(301リダイレクト)とブラウザ(および検索ロボット)に通知する。 ※それにより既存ブックマーク、リンク、特に検索エンジンの評価を温存して移行する。 ・静的URLを動的URLに変換して、既存のプログラムコードをそのまま利用する。 上記の二点を同時に実現したい。 ※その方法として、mod_rewriteを考えている。 という事であれば、mod_rewriteは向かない気がします。 下手なやり方をすれば、 動的URLを静的URLに変換→変換した静的URLを動的URLに変換→静的URL→動的URL→・・・以降無限ループ ※しかも途中でリダイレクトが入っているだけに、タイムアウトエラーさえ起きないかも知れない。 やるとすれば、変換済みフラグをURLに埋め込み、そのフラグを見てと少々ヤヤコシイ事になりそうです。 よく利用される、という理由でサンプルも多い、後者の『静的URLを動的URLに変換』の部分はmod_rewriteで良いでしょう。 前者の『動的URLを静的URLに変換、301リダイレクト』はPHPプログラムで行いましょう。 header( "HTTP/1.1 301 Moved Permanently" ); header( "Location: http://~" ); もちろん、ただこれだけでは無限ループふたたびです。 mod_rewriteの『静的URLを動的URLに変換』部分に、やっぱりフラグを埋め込みます。 たとえば下記の【】部分のように。 RewriteRule ^/dir/([0-9A-Za-z]+)/([0-9A-Za-z]+)$ /dir/index.php?【rewrited=1】&a=$1&b=$2 幸いにして、RewriteRuleで変換された結果はユーザーには見えませんので、rewrited=1とフラグを渡すことはブサイクではありません。 index.phpでは、以下のような形にすると無限ループは回避できます。 if (!(isset($_GET['rewrited'])&&$_GET['rewrited'])){ リダイレクト } 初めに無視したうち、『動的URLを静的URLに変換』側の、 >パラメータの組み合わせパターンが色々あるため上記のようなルールで対応できない というのは、PHPなので回避できたと思います。 『静的URLを動的URLに変換』側の、 >パラメータの組み合わせパターンが色々あるため上記のようなルールで対応できない への対処は最悪の場合、あとで頑張ってPHPで文字列分解する前提で、 RewriteRule ^/dir/(.+)$ /dir/index.php?arg=$1 とする、荒技(という程のものではないか?)があり得ます。 一応書いておくと、 /dir/index.php がRewriteされ/dir/index.phpに渡されるという無限ループの問題に対応するため、存在するファイル(ディレクトリ)の場合はRewriteしないルールを付加して。 すべてのパラメータを静的URLに変換(ディレクトリ構造として渡す)のは現実的ではないので、静的URLで受け付けた引数を渡せるように[QSA]。 そんな処理も含めて、まとめると以下のような形が考えられます。 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/dir/(.+)$ /dir/index.php?rewrited=1&arg=$1 [QSA,L] 実際には、パス、ファイル名等を間違えたとたんに、画像ファイル(<img>タグ)だろうが、.cssファイルだろうが、index.phpに渡されるのでその当たりの判定も必要だとか、色々と推奨できない事(荒技部分)もしている事もあり、全体として参考レベルで。
お礼
大変丁寧なご回答を頂き、まことにありがとうございます。 私の知識不足のせいで全て理解できてはいなのですが、とても参考になりました。 >前者の『動的URLを静的URLに変換、301リダイレクト』はPHPプログラムで行いましょう。 .htaccessでの対処に囚われていたため、恥ずかしい限りですが上記のアドバイスは目からウロコでした。 本質問の対応は他にも色々問題があって最終的には「ネットでありがち」な方法を採ることになりそうなのですが、丁寧なご回答には本当に感謝しています、ありがとうございました。