質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

windows版apacheで事前に準備した~.js.gzを返送したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,094

hayash-dev

score 29

現象
gzファイルを準備してあるjsやcssをクライアントが要求したら、
それらのgzファイルを返送したいですが、クライアントには404で返ります。

設定直後は、3つ目のRewriteCondで.css.gzファイルが見つからずに.cssファイルが返っておりましたが
RewriteCondに実ファイルパスを指定することで、ようやくmatchedになりました。
しかし、その後の動作で404となってしまう原因が判りません。

環境
apache バージョンは2.2です。
apache と tomcat8 を組み合わせてアプリを構築しています。
apacheはc:\apache2.2にインストールしています。
.htaccessは使用していません。(存在しません)

c:\apache2.2\conf\httpd.confの記述を抜粋します。

ServerRoot "C:/Apache2.2"
LoadModule rewrite_module modules/mod_rewrite.so
DocumentRoot "C:/Apache2.2/htdocs"
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>
<Directory "C:/Apache2.2/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteLog logs/rewrite.log
  RewriteLogLevel 9
  RewriteCond %{HTTP:Accept-Encoding} gzip
  RewriteCond %{REQUEST_URI} (\.js|\.css)$
  RewriteCond C:/pleiades4.5/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps%{REQUEST_FILENAME}\.gz -s

> eclipse開発環境用のパスです。
> 運用環境では、C:/Tomcat8.5/webappsとする予定です。

  RewriteRule .+ %{REQUEST_URI}\.gz
</IfModule>
<FilesMatch "\.css\.gz$">
  ForceType text/css
  AddEncoding x-gzip .gz .tgz
  AddType text/css .gz
  Header set Content-Encoding gzip
</FilesMatch>
<FilesMatch "\.js\.gz$">
  ForceType application/x-javascript
  AddEncoding x-gzip .gz .tgz
  AddType application/x-javascript .gz
  Header set Content-Encoding gzip
</FilesMatch>
Header append Vary Accept-Encoding env=!dont-vary

上記を実行した場合のrewriteのログは以下のように出力されます。

(3) applying pattern '.+' to uri '/project/js/bootstrap-3.3.6/css/bootstrap.min.css'
(4) RewriteCond: input='gzip, deflate' pattern='gzip' => matched
(4) RewriteCond: input='/project/js/bootstrap-3.3.6/css/bootstrap.min.css' pattern='(\\.js|\\.css)$' => matched
(4) RewriteCond: input='C:/pleiades4.5/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/project/js/bootstrap-3.3.6/css/bootstrap.min.css.gz' pattern='-s' => matched
(2) rewrite '/project/js/bootstrap-3.3.6/css/bootstrap.min.css' -> '/project/js/bootstrap-3.3.6/css/bootstrap.min.css.gz'
(2) local path result: /project/js/bootstrap-3.3.6/css/bootstrap.min.css.gz
(2) prefixed with document_root to C:/Apache2.2/htdocs/project/js/bootstrap-3.3.6/css/bootstrap.min.css.gz
(1) go-ahead with C:/Apache2.2/htdocs/project/js/bootstrap-3.3.6/css/bootstrap.min.css.gz [OK]

当該パスのcssファイルはgzも用意してあります。
イメージ説明

クライアントに返る応答ヘッダは以下の通りです。

"GET /project/js/bootstrap-3.3.6/css/bootstrap.min.css HTTP/1.1" 404 242

-2016/12/15 追記-
ネットで探し続けていますが、windows版apacheでgzファイルを返す情報が少ないと感じています。
ある場合も、.htaccessだったりします。
こういうhttpd.confで出来たよー。と、実績があるhttpd.confを
見せて頂けたら幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

RewriteRule .+ %{REQUEST_URI}\.gz

もしかしてですが、この定義では/project/js/bootstrap-3.3.6/css/bootstrap.min.cs\.gzにRewriteしてませんか?

RewriteRule .+ %{REQUEST_URI}.gz

# Rewriteで思うようにいかない場合は いったんリダイレクトに変更してみると
# どういうURLになっているかわかりやすいです。
#    (レスポンスのLocationヘッダーを見ることでどういう書き換えが行われたをみる)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/14 18:33 編集

    /project/js/bootstrap-3.3.6/css/bootstrap.min.cssを要求して404が返ってきたGETメソッドを
    Firefoxの開発者ツールにて、編集して再送信により
    /project/js/bootstrap-3.3.6/css/bootstrap.min.css.gzを要求したところ、
    ステータス200、応答ヘッダにContent-Type:"application/x-gzip"も設定されていて
    期待した応答でした。

    # Rewriteで思うようにいかない場合は いったんリダイレクトに変更してみると
    # どういうURLになっているかわかりやすいです。
    上記のリダイレクトは、RewriteRule に[R]を指定して、どこか(?)に飛ばすのだと思いますが、
    なぜ「どういうURLになっているかわかりやすい」のかがピンときていません。

    キャンセル

  • 2016/12/14 18:48

    RewriteRuleの記述に間違いがあった場合は、書き換えた結果がレスポンスの Locationヘッダーに返ってくるので期待したものと実際の結果とを比較しやすいです。
    RewriteRule .+ %{REQUEST_URI}.gz [R]

    >ステータス200、応答ヘッダにContent-Type:"application/x-gzip"も
    >設定されていて期待した応答でした。
    Oh... Rewriteの結果もログを見る限り正常で直接アクセスした場合も正常。
    すみません、お役にたてなかったようです。

    キャンセル

  • 2016/12/14 19:10

    > RewriteRule .+ %{REQUEST_URI}.gz [R]
    上記の[R]を追記したところ、応答ステータスが302になりました!

    そしてLocationですが、パッと見て正しそうです。
    Location:"http://my_pc/project/js/bootstrap-3.3.6/css/bootstrap.min.css.gz"

    キャンセル

0

なんとか解決しました。
apache+tomcatで静的圧縮ファイルを返したい人の助けになれば幸いです。

解決のヒントを与えてくれた Y.H.さんに感謝です。


ポイント1:
要求されたファイルの実体有無を判断する為には、DocumentRootやaliasを使わず、
物理的な絶対パスで参照する。

ポイント2:
実体の圧縮ファイルが存在した場合、従来だと

  RewriteRule .+ %{REQUEST_URI}\.gz

としていましたが、これだと見つからないので

  RewriteRule .+ ajp://localhost:8009%{REQUEST_URI}gz [P,L] 

として直接ajpを使ってtomcat側にファイルの要求を転送します。

ポイント3:
ajpポートにproxyした場合、FilesMatchは適用されないので
返ってくるresponseに Content-Encoding:"gzip"が付きません。
そこでFilesMatchは諦めて、gzipしたcssとjsの静的ファイル名の拡張子を
.cssgz、.jsgzと名前を変え、これらをmime_moduleで定義しました。

ポイント4:
ポイント1で %{REQUEST_FILENAME}gz としているので、要求が.cssの場合は .cssgzとなります。
同じ要求が来てもはじくようにしています。

# 追加 ↓ ポイント3
<IfModule mime_module>
    AddEncoding x-gzip .gz .tgz .jsgz .cssgz
    #AddType application/x-compress .Z
    #AddType application/x-gzip .gz .tgz
    AddType text/css .cssgz
    AddType application/javascript .jsgz
</IfModule>
# 追加 ↑

<IfModule mod_rewrite.c>
  RewriteEngine on

#ポイント4
  RewriteCond %{REQUEST_FILENAME} !(\.jsgz|\.cssgz)$
  RewriteCond %{HTTP:Accept-Encoding} gzip
  RewriteCond %{REQUEST_URI} (\.js|\.css)$
#ポイント1
  RewriteCond C:/pleiades4.5/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps%{REQUEST_FILENAME}gz -s 
#ポイント2
  RewriteRule .+ ajp://localhost:8009%{REQUEST_URI}gz [P,L] 

> eclipse開発環境用のパスです。
> 運用環境では、C:/Tomcat8.5/webapps等としてください。

</IfModule>

# コメントアウト ↓ ポイント3
#<FilesMatch "\.css\.gz$">
#  ForceType text/css
#  AddEncoding x-gzip .gz .tgz
#  AddType text/css .gz
#  Header set Content-Encoding gzip
#</FilesMatch>
#<FilesMatch "\.js\.gz$">
#  ForceType application/x-javascript
#  AddEncoding x-gzip .gz .tgz
#  AddType application/x-javascript .gz
#  Header set Content-Encoding gzip
#</FilesMatch>
# コメントアウト ↑

Header append Vary Accept-Encoding env=!dont-vary

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる