mod_rewrite / RewriteRule について教えて下さい

このQ&Aのポイント
  • mod_rewrite / RewriteRuleについて詳しく教えてください。質問者はプログラミングが専門であり、サーバー関連の知識は少ないため、具体的な情報を探すことができませんでした。
  • .htaccessに設定されたRewriteRuleで、URLの末尾にスラッシュが付いている場合に、末尾のスラッシュを除去し、URLをphpファイルにリダイレクトすることができます。
  • ただし、RewriteRuleを使用すると、HTML内の画像ファイルへの相対パスが変更されてしまい、ディレクトリの階層がズレてしまう場合があります。画像のパスもmod_rewriteで書き換えることができますが、具体的な方法については分かりません。
回答を見る
  • ベストアンサー

mod_rewrite / RewriteRule について教えて下さい

私はプログラムが専門なのでmod_rewrite等サーバー関連に疎く、かなり調べましたがこれといった情報が見つからず質問させて頂きます。 まず、.htaccessにて RewriteRule ^(.*)/$ $1.php と記載しており、 http://www.foo.com/bar/ → http://www.foo.com/bar.php に置き換えております。 この部分については思った通りに置換されておます。 しかし http://oshiete1.goo.ne.jp/qa2509320.html こちらにも書かれてますように、HTML内の画像ファイルへの参照が相対パスで書かれておりますので、RewriteRuleを上記設定にすることでディレクトリ階層がズレてしまいます。 http://oshiete1.goo.ne.jp/qa2509320.html には「画像のパスも mod_rewrite で書き換えるというのが一番スマートのような気がします。」とありますが、その具体的な方法がこのQAには記載されておらず、どうやって書いたら良いか分からないでおります。 知りたいのはパスを置き換える.htaccessへの具体的な記述方法です。 今回、画像・CSS・JavaScriptが全て外部ファイルになっており、HTML側では全て相対参照で指定されております。 SVNによる複数人開発のため絶対パスの指定が出来ませんので、相対指定で何とかならないものかと試行錯誤しております。 OSはCentOS4.3です apacheはyumでインストールしたものでhttpd-2.0.52-28となっております。 宜しく御願いいたします。

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

  • ベストアンサー
回答No.1

RewriteCondディレクティブで、書き換え対象を絞り込むというのはいかがでしょう? 置換先のphp等のファイル名に命名規則があれば、絞り込むのはかなり楽です。 例を挙げます。   phpの命名規則:必ず"foo_"、"bar_"のいずれかで始まる。(foo_hoge.php等)   ### .htaccess の内容   RewriteCond %{REQUEST_URI} ^(.*)/(foo|bar)_(.+)/$ # この行で条件を絞り込む   RewriteRule ^(.*)/$ $1.php # RewriteCondにマッチした場合にのみURI書き換えを行う なお、http://www.ksknet.net/apache/rewritecond_rew.html に情報がまとまっています。

foreach
質問者

お礼

お返事が遅くなってすみません。 しばらく回答を待ったもののレスが付かなかったので、チェックするのを忘れておりました。本当に申し訳ありません。 とりあえず色々調べた結果「出来ない」というのが現時点での答えでした。 これはWEBサーバー側の特性なのだと割り切るしかないという結論に至っております。 amazonなどを参考にするとイメージ等の外部ファイルは全てhttpから始まるフルパスで指定されており、これならURL階層がどのように崩れてもページの表示が崩れることも無いということから、お客様とも相談してフルパスにすることになりました。 いまいちメンテ効率が低くなりますが、開発中はあまり気にせず、納品直前で一気にGREP置換することで話しが帰着しました。

関連するQ&A

  • mod_rewriteを適用して

    mod_rewriteを適用したところ、リンク先HTMLがおかしくなりました。 http://xxx.jp/rewrite.php?p=1 ↓ http://xxx.jp/rewrite/1 とするようにルールを以下のように設定しました。 RewriteRule ^/rewrite/([0-9A-Za-z)]+) /rewrite.php?q=$1 すると、ドキュメントルート直下の他のファイル(hoge.php)へのリンク先HTMLが http://xxx.jp/rewrite/hoge.php となってしまいます。 なぜこうなってしまうのでしょうか?

  • mod_rewriteについて

    SEOに効果があるのかも賛否両論ですが.htaccessに以下のような指定で 拡張子がphpのものをhtmlに変更しました。 RewriteRule ^([A-Za-z0-9]+).html$ $1.php [L] ○○.htmlにアクセスがあれば実際には○○.phpを表示させるという ことで成功はしたのですが○○.phpにアクセスしても普通にページが 表示されてしまいます。 ロボットがきてhtmlとphpと同内容があればなにか問題があるのかと 思い(根拠がない勝手な妄想ですが)○○.phpにアクセスがあれば実際に 表示するのは○○.phpですが○○.htmlへリダイレクトさせたいと 思っているのですがどうやれば可能でしょうか? また実際にサーバーにアップしてあるファイルの拡張子はphpなので すがmod_rewriteでこのような設定をしただけでロボットにhtmlとして 認識されるのでしょうか? mod_rewriteは初めて使うもので希望の動作に必要性があるのかすら よくわからない状況なのですが詳しい方がおりましたら是非ご教授を お願い致します。

  • mod_rewriteの相対パス

    いつもお世話になっております。 mod_rewrite を使ってパスの書き換えを行いたいと思っております。 以前にも mod_rewrite について質問させていただいたのですが 違う方法で解決できました。 画像ファイル等のRewriteRule を教えていただきたく質問させていただきます。 例えば・・・ http://domain.jp/a.php?id=111 を http://domain.jp/a/id/111 に書き換えた場合、階層が深くなるため画像が表示されなくなります。 a.php の中には以下のような画像ファイルの記述があります。 <img src="./img/aaa.jpg"> <img src="./img/bbb.gif"> できれば、RewriteRule を使って画像ファイルのパスを書き換えたいと 思っております。 どのようなルールを書けばよろしいでしょうか。 それとも絶対パスじゃないと無理なのでしょうか。 ご教授お願いいたします。 よろしくお願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux)

  • mod_rewriteについて

    .htaccessにて、mod_rewriteを使用して、URLの書き換え を行いたいのでがうまく動作してくれません。 上記の記述で http://www.aaaaaaa.jp/php/user/bbb/index.php を http://www.aaaaaaa.jp/bbb/ に変更したいのですが どのように記述したら、動作するのでしょうか。 ご教授をお願いします。 RewriteEngine on RewriteRule ^bbb$ /php/user/bbb/index.php [L] 上記だと、http://www.aaaaaaa.jp/php/user/bbb/index.php のままです。

    • ベストアンサー
    • PHP
  • mod_rewriteについて

    サーバーはさくらのスタンダードを利用しています。 mod_rewriteの動作について質問なのですが・・・ /item/details/5/などにアクセスがあった場合実際には /item/details.php?id=5が動作させるべく.htaccessに以下のように /(スラッシュ)で区切るとなぜか動作しません。 RewriteRule ^item/details/([0-9])/ item/details.php?id=$1 [L] 試しに以下のように_(アンダーバー)でつなげると意図する動作を 行います。 RewriteRule ^item_details/([0-9])/ item/details.php?id=$1 [L] どうすれば意図するようなurlで動作することが可能でしょうか?

  • mod_rewriteの書き方について

    よろしくお願いします。 サーバーをhttp://80codeを使っています。 今回、mod_rewriteを使って静的アドレスにしようとしていますが、 404エラー(見つかりません)がでてしまい、うまく表示されません。 設定が間違っていますでしょうか? http://repo.teki2.com/に両方のファイルとも設置しています。 接続しに行っているアドレスは、http://repo.teki2.com/1/ です。 http://repo.teki2.com/index.php?mode=1 だとうまくいきます。 .htaccessの内容 RewriteEngine on RewriteRule ^/([0-9a-zA-Z]+)/$ /index\.php?mode=$1 [L] index.phpの内容 <?php echo $mode; ?> よろしくお願いします。

    • 締切済み
    • CGI
  • CentOSでhtaccessを使用してmod_rewrite

    CentOSで、htaccessを使用してmod_rewriteを利用したいのですが、いまいちどうしたらいいのかがわかりません。 動的URLを静的URLに変換したく、 htaccessに RewriteEngine on RewriteRule ^([0-9A-Za-z_]+)/$ index.php?t=$1 [L] と書きこみました。 すると404エラーがでます。 試しに #RewriteEngine on RewriteRule ^([0-9A-Za-z_]+)/$ index.php?t=$1 [L] とコメントアウトしたところ、通常に表示されました。 RewiteEngine on が何かしらの影響を与えていると思うのですが、 対策がよくわからないので質問いたしました。 ちなみにhttpd.confの設定は完了しています。 LoadModule rewrite_module modules/mod_rewrite.so と記述。

  • mod_rewriteで存在するファイルの設定方法

    mod_rewriteで質問です。 http://foo.com/test.php というファイルを http://foo.com/test でアクセスできるようにしたいです。 login.phpはディレクトリに存在する状態です。。 レンタルサーバーの仕様なのか、 RewriteRule test /test.php としてもInternal Server Errorになります。 ただ、 RewriteRule aaa /test.php と設定すると、 http://foo.com/aaa でtest.phpにアクセスできることはわかりました。 test.phpが存在する状態だとこれはできないことなのでしょうか?

  • mod_rewriteについて教えてください。

    mod_rewriteについてお願いします。 「a」と「b」というフォルダにそれぞれ「index.html」「test.html」が入っています。「a」と「b」で「index.html」「test.html」の内容はちがいます。 わたしが一番望んでいるのは http://example.com/a/以下にアクセスがあった場合 http://example.com/b/以下にリダイレクトさせるというものです。 例) http://example.com/a/test.htmlにアクセスがあったらhttp://example.com/b/test.htmlにリダイレクト。 ------------------------------------------------------------ Options +FollowSymLinks AddHandler cgi-script htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/a/$ /b/$1 [R=302,L] </IfModule> ------------------------------------------------------------ としてみましたが、リダイレクトされません。 ちなみに RewriteRule ^$ /b/$1 [R=302,L] と書くと、http://example.com/にアクセスがあった場合 http://example.com/b/にリダイレクトされましたので mod_rewriteには対応しております。 ご教授のほど、よろしくお願いいたします。

  • mod_rewriteについて

    mod_rewriteについてしつもんです。 http://aaa.jp/bbb.php?c=100&d=200 ↓ http://aaa.jp/bbb_100.html?d=200 とできるんでしょうか? 設定してみたのですが、以下では機能しませんでした。 RewriteRule ^/bbb([0-9]+)\.html(.*)$ /bbb.php?c=$1$2 よろしくお願いします。