• 締切済み

Apacheのmod_rewriteに関してお

Apacheのmod_rewriteに関してお教えください。 お世話になります。 色々なサイトを参考に試していますが、思う様にいかず困っています。 知恵をお借り頂けたらと存じます。 ・「mod_rewrite」を利用したメンテナンス画面の表示。 ・「F5」等で更新した際、本来の画面が表示される様、内部的な置き換えのみとしたい。 ・使用しているWebサーバは(Apache2.2系) ・「mod_proxy_ajp」を利用したコネクタ連携を行っている。 ・ホスト名によるバーチャルホスト ・configファイルに記載する方法で試し中 ・メンテ用html メンテナンス用htmlは、別途指定した「DocumentRoot」に配備しており、 同ディレクトリにイメージファイル格納用フォルダがある。 そのフォルダ内にimgファイルが配備されている。(pngファイル等) DocumentRoot Lhtmlファイル L格納フォルダ\イメージファイル 現在、Apacheの機能に関して勉強中です。 メンテナンス用画面表示用として、例えば色々なサイトに有るような、以下記載をしたとします。 --------- RewriteCond %{REQUEST_FILENAME} !(/メンテナンス画面.html|.*\.(gif|jpe?g|png|js|css|ico))$ RewriteRule ^(.*)$ /メンテナンス画面.html [R=503,P,L] --------- 「http://ホストIP/」等でアクセスした場合、ドキュメントルートを参照、意図した動きとなるのですが、 「http://ホストIP/^ユーザディレクトリ/」や、「http://ホストIP/Aliasディレクトリ/」等 一階層深いURLだった場合、メンテ用htmlは、表示されるのですが、参照イメージファイルがパス違いにより 参照出来なくなり、意図した動きとなりません。 ※ 「http://ホストIP%{REQUEST_URI}」配下を参照しようとしている。(RewriteLogより) 「RewriteRule ^(.*)$」だと全てになってしまう為、ルールを分け設定してみましたが 第3引数の指定が悪いのか設定した「RewriteRule」を全て参照し「RewriteCond」が動いてしまう。 引数や正規表現の問題だとは考えておりますが、なかなか正解に辿り着けません。 よろしくお願いします。

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

あらゆるものをメンテナンス画面に飛ばす時、メンテナンス画面での画像指定は絶対パスにするのが鉄則だ。 <img src="/格納フォルダ/イメージファイル.png /> これはrewriteうんぬんではなくって、ブラウザがどう画像を探しに行くかの話。 ~~~~~~~~ ところで、 RewriteCond %{REQUEST_FILENAME} !(/メンテナンス画面.html|.*\.(gif|jpe?g|png|js|css|ico))$ RewriteRule ^(.*)$ - [R=503,L] ErrorDocument 503 /メンテナンス画面.html の方がいいかも。

karkotaka
質問者

お礼

anmochi 様 情報頂きありがとうございます。 修正後、いくつか参照して確認してみました。 大丈夫そうです。ありがとうございます。 htmlファイル内の画像参照に関して、試した事はあったのですが (サーバ上の)フルパスのみでした。 確かに、他の画面を(練習で)作成した際、DocumentRoot(今回はRewriteBase?)を ルート(/)として指定する方法もした事がありました。 うっかりしていた様です。 > あらゆるものをメンテナンス画面に飛ばす時、メンテナンス画面での画像指定は絶対パスにするのが鉄則だ。 頭?に刻んでおきます。 > ところで、~~ この記載方法も試してはいました。(今現在は違っている) マニュアルを見つつ、お教え頂いた内容を参考に設定方法を見直そうと考えております。 ありがとうございます。助かりました。

関連するQ&A

  • mod_rewriteが効かない!

    サーバの運用上、mod_rewriteを使う必要が出来たので設定してみたのですが効きません。 FreeBSD4.11+Apache1.3.33で httpd.confファイルに直接書き込んで試しています。 LoadModule rewrite_module modules/mod_rewrite.so AddModule mod_rewrite.c のどちらも書いてあるにもかかわらず、下記のテスト設定を試してみたらローカルIPからアクセス出来てしまいます。 RewriteEngine on RewriteCond %{REMOTE_ADDR} ^192\.168\.1\. ←ローカルネットワークのアドレス RewriteRule ^.*$ - [F] どのようにしたらいいですか? アドバイスお願い致します。

  • httpsでmod_rewriteができない

    はじめまして。 Linux環境で、apacheのhttp.confにmod_rewriteを記載し、httpsとhttpを切り替えたいと思っています。 httpd.confに以下のように記述しています。 <IfModule mod_rewrite.c> RewriteEngine on  #(1)httpで/aaaa/bbbbにアクセスされたときにhttps://~に変えたい RewriteCond %{REQUEST_URI} ^/aaaa/bbbb RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R]  #(2)httpsで/cccc/ddddにアクセスされたときにhttp://~に変えたい RewriteCond %{REQUEST_URI} ^/cccc/dddd RewriteCond %{HTTPS} on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R] </IfModule> 上記(1)のhttpでのアクセス時には、mod_rewriteが効いてhttpsへ切り替えられるのですが、 上記(2)のhttpsでのアクセス時には、mod_rewriteが効いていないようでhttpへ切り替えられません。 rewriteログを見てみると、当サイトへhttpでアクセスした場合にはログが出力されますが、 httpsでアクセスした場合には出力されません。 そもそもhttpsでのアクセスの場合にhttpd.confのmod_rewriteが効いていないようです。 ですが、これに対しどこを調査すべきかが分かっていません。 SSLの設定自体は出来ていると思っていて、 https://xxxx.jpのようにアクセスするとちゃんとページが表示されます。 どの当たりに問題がありそうでしょうか? 解析のヒントを頂けたらと思います。 宜しくお願い致します。

  • mod_rewriteについて

    mod_rewriteの質問です。 RewriteEngine on RewriteCond %{TIME_DAY}.html -s RewriteRule index.html test.php RewriteRule index.html %{TIME_DAY}.html と記述しているのですが、 %{TIME_DAY}.html が存在するのに、 RewriteCond部分でないと判定され、 %{TIME_DAY}.html が読まれてしまいます。 RewriteCond部分の条件部分の記述方法が間違っているのでしょうか?

  • 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:調べられません・・・わりと新しいバージョンです。

  • mod_rewriteについて

    いつもお世話になっております。 mod_rewriteを使ってURLの書き換えをしたいと思っております。 下記のようなファイルがあるとします。 http://www.domain.com/aaa/list.php http://www.domain.com/aaa/detail.php http://www.domain.com/bbb/list.php http://www.domain.com/bbb/detail.php PHPファイルはHTMLに書き換えています。 ---------------------------------------- RewriteEngine on # QUERY_STRING RewriteRule /([a-z]+)\/([a-z]+)\/([0-9]+)\.html$ /$1/$2.php?$3 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*)\.html$ /$1.php [L] ---------------------------------------- http://www.domain.com/aaa/detail/2.html http://www.domain.com/bbb/detail/2.html 上記どちらにアクセスしてもページが表示されませんと なってしまいます。 どうぞ、ご教授お願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux)

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

    .htaccess に、mod_rewrite の記述を書いて、以下のようなことをしたいのですが、 1.http://www.example.com/abc/ の場合 URLはそのままで、内容は /main/abc/以下 (の同名ファイル)を表示 2.http://www.example.com/main/abc/ の場合 URLは http://www.example.com/abc/ になり、内容は/main/abc/を表示 以前教えていただいた以下の記述でできるのですが、ディレクトリが追加されたら、.htaccess にも追加が必要になってしまいます。 どのように実現すればよいでしょうか? ------------------------------------------------------------ RewriteCond %{REQUEST_URI} ^/main/(.*)$ RewriteCond %{HTTP:My_Redirect} !yes RewriteRule ^main/(.+)$ http://example.com/$1 [QSA,R] RewriteCond %{REQUEST_URI} ^/(abc|aaa|bbb|ccc|ddd)/ RequestHeader set My_Redirect yes RewriteRule ^(.*)$ /main/$1 [QSA,L] ------------------------------------------------------------

  • mod_rewriteを使用するための設定について

    お世話になります。 mod_rewriteの設定についてアドバイスいただきたいと思います。 今までレンタルサーバーで.htaccessを使って、動的URLを静的URLでアクセスさせることに用いていたのですが、自前サーバー(FedraCore2.0+Apache2.0.53)にその.htaccessファイルを移してみたところ、思ったような動作をしてくれません。色々なサイトを参考に見て回ったところ、「httpd.conf」が怪しいと感じたのですが、 LoadModule rewrite_module modules/mod_rewrite.so LoadModule proxy_module modules/mod_proxy.so の箇所もコメントアウトされておりますし、過去ログにもあったバーチャルホストの併用もしておりません。 ちなみに.htaccessは下記のような内容です。 DirectoryIndex index.htm index.php .ht RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^doc-([0-9]+).htm+ doc.php?number=$1 レンタルサーバーでは問題なく動作しておりましたので、.htaccess側の問題ではなくApache側の問題だと思っております。どなたかアドバイスの程よろしくお願いいたします。

  • mod_rewrite 環境変数への参照

    mod_rewriteで、RewriteCondディレクティブの条件パターンから環境変数を参照する方法は、無いものでしょうか…。 具体的には、たとえばよくある「直リンク禁止」がありますよね。 RewriteCond %{HTTP_REFERER} !^https?://([^/]+\.)?hogehoge.com/ [NC] …(拒否指定) という感じに書きますが、この「hogehoge.com」の部分を、いちいちバーチャルホストごとに書き換えなくていいとか、もっと言えばグローバル設定に1回だけ設定すれば良いようにすべく、 RewriteCond %{HTTP_REFERER} !^https?://([^/]+\.)?%{SERVER_NAME}/ [NC] …(拒否指定) と書きたいわけです。 しかしパターンの中で%{SERVER_NAME}が展開されないようで、後方参照はどうかとためしに RewriteCond %{SERVER_NAME} ^(.+)$ RewriteCond %{SERVER_NAME} ^$1$ としても2つ目はnot-matchedが返されます。環境変数も参照変数も展開されない?… ダメモトで RewriteCond %{SERVER_NAME} ^(.+)$ RewriteCond %{SERVER_NAME} ^%1$ でも同様でした(%1という書き方はテスト文字列のほうだと、解ってはいます…)。 RewriteRuleのほうだけが後方参照できるというのも中途半端な気がして、何か方法があるのではと探しています。 どなたか御存じないでしょうか。 それとも仕様なのでしょうか。

  • mod_rewriteがループして困っています。

    お世話になります。 mod_rewriteについて質問させていただいたものです。 おかげさまで、動的ページを静的に変更することができました。 が、最後にまた困ってしまったので、教えてください。 (1)hoge/mod_12.html で (2)hoge.php?mod=12 にアクセスできるようになりました。 が、(2)で保存された検索エンジンのランキングを、(1)に引き継ぐため、 .htaccessにつぎのようなコードを書いたところ、ループしている旨のエラーが出てしまいます。 RewriteEngine on RewriteCond %{QUERY_STRING} ^(.*)=(.*)$ RewriteRule ^hoge.php$ http://×××/hoge/%1_%2.html? [R=301,L] RewriteEngine on RewriteRule ^hoge/(.*)_(.*).html$ hoge.php?$1=$2 [L] 確かに、ループしているのですが、回避方法が分かりません。 オプションの設定で回避できないかと、オンラインマニュアルも見たのですが、OS・TCP/IP等の知識が乏しいためか、解読できません。 すみませんが、ループの回避の仕方を、ご教授の程、よろしくお願いいたします。

  • 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 よろしくお願いします。