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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Q&A

解決済

2回答

2201閲覧

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

hayash-dev

総合スコア50

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

0グッド

0クリップ

投稿2016/12/14 06:01

編集2016/12/15 11:28

現象
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の記述を抜粋します。

httpd.conf

1ServerRoot "C:/Apache2.2" 2LoadModule rewrite_module modules/mod_rewrite.so 3DocumentRoot "C:/Apache2.2/htdocs" 4<Directory /> 5 Options FollowSymLinks 6 AllowOverride None 7 Order deny,allow 8 Deny from all 9</Directory> 10<Directory "C:/Apache2.2/htdocs"> 11 Options Indexes FollowSymLinks 12 AllowOverride None 13 Order allow,deny 14 Allow from all 15</Directory> 16<IfModule mod_rewrite.c> 17 RewriteEngine on 18 RewriteLog logs/rewrite.log 19 RewriteLogLevel 9 20 RewriteCond %{HTTP:Accept-Encoding} gzip 21 RewriteCond %{REQUEST_URI} (\.js|\.css)$ 22 RewriteCond C:/pleiades4.5/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps%{REQUEST_FILENAME}\.gz -s 23 24> eclipse開発環境用のパスです。 25> 運用環境では、C:/Tomcat8.5/webappsとする予定です。 26 27 RewriteRule .+ %{REQUEST_URI}\.gz 28</IfModule> 29<FilesMatch "\.css\.gz$"> 30 ForceType text/css 31 AddEncoding x-gzip .gz .tgz 32 AddType text/css .gz 33 Header set Content-Encoding gzip 34</FilesMatch> 35<FilesMatch "\.js\.gz$"> 36 ForceType application/x-javascript 37 AddEncoding x-gzip .gz .tgz 38 AddType application/x-javascript .gz 39 Header set Content-Encoding gzip 40</FilesMatch> 41Header 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を
見せて頂けたら幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

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

投稿2017/02/20 12:01

hayash-dev

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 08:02

編集2016/12/14 08:22
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayash-dev

2016/12/14 08:32

Y.H.様 返信ありがとうございます。 \.gzは確かに誤りで、ここも正規表現部分と勘違いしておりました。 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule 修正して確認したところ、起票時と同じ内容でrewriteログが出力されましたので これが原因という訳ではなさそうです。
Y.H.

2016/12/14 09:05 編集

/project/js/bootstrap-3.3.6/css/bootstrap.min.css.gz 直接指定してアクセスするとどうなりますか?これが404で返ってると、rewriteの設定ではなく、.gzのとき404で返してる設定が有りそうです。
hayash-dev

2016/12/14 09:34 編集

/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になっているかわかりやすい」のかがピンときていません。
Y.H.

2016/12/14 09:48

RewriteRuleの記述に間違いがあった場合は、書き換えた結果がレスポンスの Locationヘッダーに返ってくるので期待したものと実際の結果とを比較しやすいです。 RewriteRule .+ %{REQUEST_URI}.gz [R] >ステータス200、応答ヘッダにContent-Type:"application/x-gzip"も >設定されていて期待した応答でした。 Oh... Rewriteの結果もログを見る限り正常で直接アクセスした場合も正常。 すみません、お役にたてなかったようです。
hayash-dev

2016/12/14 10:10

> RewriteRule .+ %{REQUEST_URI}.gz [R] 上記の[R]を追記したところ、応答ステータスが302になりました! そしてLocationですが、パッと見て正しそうです。 Location:"http://my_pc/project/js/bootstrap-3.3.6/css/bootstrap.min.css.gz"
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問