mod_rewriteを使って動的ページを静的ページへリダイレクトする方法

このQ&Aのポイント
  • 質問1:ディレクトリを指定すると静的化できない理由は何ですか?
  • 質問2:mod_rewriteで静的化する際に、URLの結果を返すのと逆にする意味はありますか?
  • 質問3:/hoge/index.php?id=1に対して、hoge/1.htmlの結果を返すようにする方法はありますか?
回答を見る
  • ベストアンサー

mod_rewrite 動的ページを静的ページへ

SEO対策として、動的ページを静的ページへリダイレクトさせたいと考えています。 レンタルサーバーのため、.htaccessへ記入するしか方法はないと思っているのですが、 そもそも「静的化するってこと自体」がよく分かってないので、教えてください。 <現状> ▼URL /hoge/index.php?id=1 ▼.htaccess RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9A-Za-z]+)\.html$ details.php?id=$1 [L] <結果> 実行すると、/hoge/1.htmlとなり、望む結果を得られるのですが、 念のためディレクトリを指定しておきたいと思い、 RewriteRule ^/hoge/([0-9A-Za-z]+)\.html$ /hoge/details.php?id=$1 [L] としたところ、全く静的表示されなくなりました。 ■質問1 なぜ、ディレクトリを指定すると静的化できないのでしょうか? ■質問2 ネットでmod_rewriteの解説ページを検索してみると、静的化の例として、 「hoge/1.html へアクセスがあった際に、index.php?id=1の結果を返す」、 と記載されてます。 「index.php?id=1へアクセスした際に、hoge/1.html の結果を返す」 ようにした方がいいと思うのですが、 これって結果的には同じことをしている、と考えてよいのでしょうか? ■質問3 例えば、「/hoge/index.php?id=1」に対して、 「index.php?id=1へアクセスした際に、hoge/1.html の結果を返す」 ようにするには、どう書けばよいのでしょうか?

  • re999
  • お礼率61% (476/777)
  • PHP
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4845/10255)
回答No.3

#1です。 「静的化」というのは技術用語じゃなくてSEO業界用語なので、厳密な意味はなくて使う人によりそれぞれと思いますが、おおむね、「QUERYSTRING(URLの ? 以降)を、ユーザから見えなくする」 ということのようです。 別の言い方をすると、「PHPやPerlなどを使い、QUERYパラメータを見てHTMLページをスクリプトでリクエスト毎に動的に生成して見せるのでなく、予め作ってあるHTMLファイルを見せているかのごとく見せかける」。毎回動的に作っていない=静的 ということ。 つまり、HTML中の A タグの hrefなどもすべて、/hoge/1.html のように変更します。 サーバー内で実際には index.php がQUERYSTRINGを処理する訳なので、サーバの入り口で /hoge/1.html を、index.php?id=1 の形式に変換してPHPを起動してやる必要があります。 やることは2つで、 1) HTML生成しているスクリプトの a href= の部分の作成部分を修正して、<a href="index.php?id=1"> とかを作成している部分を、<a href="1.html"> とかを作成するようにする 2) .htaccess で、rewrite 機能を使って、1.html 等を index.php?id=1 等に書き換えるようにする

re999
質問者

お礼

ありがとうございました! ものすごく勘違いしていたことがよく分かりました…。 丁寧に解説していただいたので、とても分かりやすかったです!

その他の回答 (2)

noname#130824
noname#130824
回答No.2

■質問1 RewriteRule ^/hoge/([0-9A-Za-z]+)\.html$ /hoge/details.php?id=$1 [L] では動作しません。 htaccessのルールを無視した書き方では動作しません。 Rフラグなしの場合は相対パス。

参考URL:
http://xn--u8jxb9ib9150b2px.jp/htaccess/rewritecgi/
re999
質問者

お礼

>Rフラグなしの場合は相対パス。 ありがとうございました。全然気がつきませんでした。 参考URLも、勉強になりましたー。

  • notnot
  • ベストアンサー率47% (4845/10255)
回答No.1

勘違いしてらっしゃるようです。mod_rewriteで何もしないと、 index.php?id=1のURLへブラウザでアクセスすると、サーバのindex.phpが起動されてid=1がわたる ですよね。それを、 hoge/1.htmlのURLへブラウザでアクセスすると、サーバのindex.phpが起動されてid=1がわたる ようにしたいのですよね? それを短く書くと >「hoge/1.html へアクセスがあった際に、index.php?id=1の結果を返す」、 ということです。 質問1 .htaccessを hoge/.htaccess に置いているのであれば、URL中の/hogeは除去されてからmod_rewriteで処理され、処理後に再度付加されます。

re999
質問者

補足

>勘違いしてらっしゃるようです。 根本的に勘違いしていたようなので、追加で教えてください。 「静的化する」というのは、 「index.php?id=1のURLへブラウザでアクセスすると、サーバのindex.phpが起動されてid=1がわたる」という処理自体を変えるのではなくて、 上記の処理+さらに下記のような別の処理も走らせる、ということなのでしょうか? 「hoge/1.htmlのURLへブラウザでアクセスすると、サーバのindex.phpが起動されてid=1がわたる」 つまり、最終的には、「index.php?id=1」へアクセスしたら、自動的に「hoge/1.html」へ切り替わるのではなく、 「index.php?id=1」(動的url)でもアクセスできるし、「hoge/1.html」(静的url)でもアクセスできる状態になる、ということを意味しているのでしょうか? 言い換えると、例えば、既存で動的にサイトを構築している場合、動的にリンクを生成している部分については、リンクの張替えをしないと、静的にならない、みたいな理解で、合ってますでしょうか?

関連するQ&A

  • mod_rewriteの書き方に困っています。

    http://www.○○○.com/1/2/3.htmlといった静的なリクエストを、 .htaccessを使って動的リクエストに読み替えています。 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)\.html$ index.php?a=$1&%{QUERY_STRING}[L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/([^/]*)\.html$ index.php?a=$1&b=$2&%{QUERY_STRING}[L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ index.php?a=$1&b=$2&c=$3&%{QUERY_STRING}[L] 違うのはディレクトリの階層(=引数の数)で、最大でa~eまで5つです。 ご覧のとおり、引数がいくつの場合でも、条件は同じなのです。 もっとスマートに書く方法があると思い、あれこれ試していますが、 自力ではうまくいかず、この形で運用しています。 技術向上のため、簡潔な書き方があれば知りたいです。 お気づきの書き方をご教示下さい。よろしくお願いします。 なお、php等を使ったスクリプトでの解析の提案ではなく、 .htaccessの記述方法としてのアドバイスをお願いします。

  • mod_rewriteで静的化(PHP)

    ご質問です。 例えば以下のような静的なページをmod_rewriteを使って.htaccessで作成しようとしています。 RewriteRuleの記述内容がよくわからず困っています。 また、.htaccessは、どのディレクトリに配置すればよいでしょうか。 どなたかご存知でしたら教えて下さい。 http://localhost/free/index.php?action=member →http://localhost/free/member http://localhost/free/index.php?action=bbs →http://localhost/free/bbs http://localhost/free/index.php?action=usr →http://localhost/free/usr このような記述をしていますが、ご指摘お願いします。 ---------------------- DirectoryIndex index.php RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9A-Za-z)]+)$ index.php?action=$1 [L] ---------------------- 宜しくお願いします。

    • 締切済み
    • PHP
  • mod_rewrite設定について

    タイトル通りPHPではなく、mod_rewriteについての質問になります。 適切なカテゴリが見当たらなかったので、PHPカテゴリであれば適切な回答を頂けると考えてこちらに書かせていただきます。 一応、.htaccess内にmod_rewriteの記述をして動作させる事はできていますが、理解が浅く応用が効かないレベルです。 ちょっと、今回その応用が必要になって、ハマッてしまいました。 仮に現在、以下のようなユーザディレクトリ形式のレンタルサーバで動作しているサイトがあるとします。 ttp://example.com/hoge/ RewriteEngine On RewriteBase /hoge/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /hoge/blog/index.php [L] この例では、.htaccessを【ttp://example.com/hoge/】に置いて、その下の階層に置かれたblogディレクトリのindex.phpにリダイレクトさせるという事ですが。 今回該当サイトのサーバを移動する事になって、ユーザディレクトリ形式ではなく、サブドメイン式の以下のようなレンタルサーバへ移動する事になりました。 ttp://hoge.example2.com/ もちろん、.htaccessの内容も書き換えて、以下のようにちゃんと変更して動作させる事ができています。 RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /blog/index.php [L] .htaccessを基準として見れば、自分(.htaccess)よりも下のblogディレクトリにアクセスするのは変わりないので、相対記述さえできれば…と試してみたところ、動きませんでしたorz。 どの階層に置かれても100%動く!!.htaccessが置かれたディレクトリをリネームされても大丈夫!! という記述方法があればベストなんですが。 ※特殊な環境では無理だが、一般的環境では8割方動くだろうという事でも可 そんな記述方法がないにしても理解が浅いために、「たぶん無理だろう」という予感を持っているだけで「このような理由で技術的に無理です」と言えないところに問題が。 ※ワードプレスのような広く使われているシステムが、ディレクトリ移動の際には書き換えの必要があるため。方法があるなら、きっとその方法は既に導入されているはずという予感から。 よろしければ、ご教授ください。

    • 締切済み
    • PHP
  • mod_rewriteでQUERYパラメータ数操作

    mod_rewriteで、静的化したいのですが、 QUERYパラメータ数が変化する場合には、どうすればよいでしょうか? ■現状 ▼URL /hoge.php?id=1 ▼.htaccess RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^hoge([0-9A-Za-z]+)\.html$ hoge.php?id=$1 [L] QUERYパラメータ数が一個のときは、 hoge1.htmlとなり、うまくいくのですが、 下記URLのようにQUERYパラメータがない場合があり、その場合に、エラーとなります(元のリンク自体も書き変えるので)。 /hoge.php QUERYパラメータ数が変化する(ない場合もある)時の.htaccessは、 どのように書けばよいのでしょうか? ・htaccess内で、条件分け可能なのでしょうか?

    • ベストアンサー
    • PHP
  • mod_rewriteの書き方について

    mod_rewriteの書き方について いつもお世話になっております。 mod_rewiteについて質問させていただきます。 複数の設定をしたいのですが、404のエラーが出てしまい思っている動作になりません。 -------------------------------------------------- RewriteEngine on (1) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule hoge/(.*)\/(.*)\/(.*)\/(.*)\.html$ /hoge/$1/$2.php?$3=$4 [L] RewriteRule hoge/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\.html$ /hoge/$1/$2.php?$3=$4&$5=$6 [L] (2) RewriteRule (.*)\.html$ /$1.php [L] -------------------------------------------------- 上記の設定を記載しております。 (1)はパラメーターがあった場合、URLの書き換えをしています。 ここはちゃんと動作しております。 (2)で、http://www.hoge.com/dir/index.html にアクセスした場合 /dir/index.php を呼び出すことに成功はしています。 ただ、http://www.hoge.com/dir/category.html にアクセスした場合 PHPファイルではなく、HTML(/dir/category.html)の場合404のエラーになってしまいます。 分かりづらい説明で申し訳ございませんが、ご教示よろしくお願いいたします。 [環境]  PHP:5.1.6  Linux:調べられません・・・わりと新しいバージョンです。

  • htaccess mod_rewriteのドット

    ワードプレスをインストールし.htaccessをのぞいてみると以下のようにあります。 RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] 一番下のRewriteRuleは%{REQUEST_FILENAME}がルートディレクトリ直下にあるファイルやディレクトリでなければ、RewriteRule . /index.php [L]を実行するという理解でいいでしょうか? それとRewriteRule . /index.php [L]のドットはどういう意味でしょうか? ドットは一文字ということだとおもいますが、では、mysite.co.jp/kはmysite.co.jp/indx.phpに修正される?ということでしょうか?現状では、mysite.co,jp以下に適当な文字列を入力してmysite.co.jp/dgfdhgfghfdhなどとしてもそのURLのままサイトが表示されてしまいます。記事の部分は404NotFoundなのですが。。 情報はあるのですが、調べても混乱してしまうのでご存知でしたらよろしくお願いいたします。 Apache wordpress

    • 締切済み
    • PHP
  • mod_rewriteに適用したくないファイルがある場合は?

    RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9A-Za-z_)]+)\.htm$ http://www.****.com/$1.php [L] ↑のようにhtaccessでphpをhtmに見せているんですが、 1.フォルダ内のphpファイルでも一部にこれを適用したくない場合はどのように書けばいいのでしょうか? 2.この.htaccessファイルがある下層のフォルダにはmod_rewriteを適用したくない場合はどのように書けばいいのでしょうか? (.htaccessの効果って下層フォルダにも効いてしまいますよね?) どちらかだけでもいいので、分かる方いらっしゃれば手助けしていただければうれしいです。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • mod_rewriteでこう書くと

    某オープンソースのPHPプログラムに、動的ページを静的ページに見せるSEO対策として、 http://...../xxx.php というURLのphpファイル名の拡張子.phpをとって http://...../xxx/ で運用するよう、.htaccessに、 RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/?(.*) $1.php/$2 [L] という記述があります。 しかし、試しに私のWindows上のlocalhostで走らせて、自分のブラウザから拡張子なしのURLでアクセスすると、HTTP404のページ未検出エラーになってしまいます。mod_rewite自体のエラーは出ません。 私には、ここのRewriteCond, RewriteRuleがよく理解できず、なぜうまくrewriteされずにエラーになるのか、どう対処すればよいかわからずにいます。 どなたか、上記のディレクティブの意味するところ、または対処方法を教えていただけませんでしょうか。 ちなみに正規表現というものについては初歩的なことは理解しております(が、上記の正規表現は理解できません)。 よろしくお願いします。

  • mod_rewriteの変換について

    こんにちは。 現在、業務でmod_rewriteの設定をしているのですが、こまっています。 やりたい事は http://localhost/hoge/aaa/bbb/ のアクセスがきた時に http://localhost/hoge/?action_aaa_bbb_index=true の内容を表示したいです。 但し、URLは http://localhost/hoge/aaa/bbb/ という感じです。 他のサイトで調べて、設定をしたのですがどうしても http://localhost/hoge/aaa/bbb/ アクセスすると http://localhost/hoge/以下のディレクトリィが表示されてしまいます。 また最後のオプションを[R]にすると表示はされますが http://localhost/hoge/?action_aaa_bbb_index=true にURLが書き換わってしまいます。 (これは当然なので、認識しています。) 以下、設定を記述します。 よろしくお願いします。 ■環境 windows XP apache2.2 ■記述箇所 httpd.conf --------設定内容--------- RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/hoge/([0-9A-Za-z]+)/([0-9A-Za-z]+)/?$ /hoge/?action_$1_$2_index=true [L] AllowEncodedSlashes On

  • .htaccessにmod_rewriteを設定して静的なURLにしたい

    .htaccessにmod_rewriteを設定して、動的なページのURLを静的なURLにしたいのですが、うまくいきません。 http://localhost/test/hoge.php/aiueo というURLで http://localhost/test/hoge.php?key=aiueo になるようにしたいのです。 検索して試しに以下のように記述したのですが、ダメでした。 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/test/hoge.php/(.+) /test/hoge.php?key=$1 [L] </IfModule> また「aiueo」の部分にスラッシュを含む場合もあるのですが、その際にも対応できるようにしたいです。 ご回答の程、よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう