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

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

ただいまの
回答率

88.91%

.htaccessでRewriteRuleを使ってURLを書き換えると”File does not exist”になってしまう

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 139

abroad128

score 8

当方で用意したAWSのEC2上のApacheのWEBサーバーからクライアントが画像を取得しようとしたときに,サーバーにファイルが存在しない場合は,EC2が自宅のWEBサーバーからファイルを取得して,それをクライアントに返すようにしたい.

そこで,AWSのWEBサーバーの[DocumentRoot]/archive/.htaccessに下記のように設定した.

RewriteEngine On
RewriteCond %{REQUEST_URI} ^.*/storage/[^/]+\.(jpg|png|gif)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^storage/([^/]+\.(?:jpg|png|gif))$ http://xxx.xxx.xxx.xxx:8080/storage/$1 [L,P]


例えば,https://hoge.jp/archive/storage/aaa.jpgにアクセスして,ファイルが存在しない場合はリバースプロキシでhttp://xxx.xxx.xxx.xxx:8080/storage/aaa.jpgからデータを取得してクライアントに返すようにしたい.

しかし,https://exmaple.com/archive/storage/aaa.jpgにアクセスすると404エラーとなってしまう.

Apacheのerrorログを見ると以下のようになっていて,最後の行のhttp://xxx.xxx.xxx.xxx:8080/storage/aaa.jpgはブラウザから直接アクセスすれば画像を見ることができる上に,EC2上でwgetすると正常に取得できる.

解決方法が分かる方はいらっしゃいますでしょうか.

[Sun Jul 12 00:05:16.006257 2020] [rewrite:trace3] [pid 15694] mod_rewrite.c(482): [client xxx.xxx.xxx.xxx:61496] xxx.xxx.xxx.xxx - - [hoge.jp/sid#7f7a55236f10][rid#7f7a551bc0a0/initial] [perdir /home/ubuntu/public_html/archive/] strip per-dir prefix: /home/ubuntu/public_html/archive/storage/aaa.jpg -> storage/aaa.jpg
[Sun Jul 12 00:05:16.006267 2020] [rewrite:trace3] [pid 15694] mod_rewrite.c(482): [client xxx.xxx.xxx.xxx:61496] xxx.xxx.xxx.xxx - - [hoge.jp/sid#7f7a55236f10][rid#7f7a551bc0a0/initial] [perdir /home/ubuntu/public_html/archive/] applying pattern '^storage/([^/]+\\.(?:jpg|png|gif))$' to uri 'storage/aaa.jpg'
[Sun Jul 12 00:05:16.006278 2020] [rewrite:trace4] [pid 15694] mod_rewrite.c(482): [client xxx.xxx.xxx.xxx:61496] xxx.xxx.xxx.xxx - - [hoge.jp/sid#7f7a55236f10][rid#7f7a551bc0a0/initial] [perdir /home/ubuntu/public_html/archive/] RewriteCond: input='/archive/storage/aaa.jpg' pattern='^.*/storage/[^/]+\\.(jpg|png|gif)$' => matched
[Sun Jul 12 00:05:16.006286 2020] [rewrite:trace4] [pid 15694] mod_rewrite.c(482): [client xxx.xxx.xxx.xxx:61496] xxx.xxx.xxx.xxx - - [hoge.jp/sid#7f7a55236f10][rid#7f7a551bc0a0/initial] [perdir /home/ubuntu/public_html/archive/] RewriteCond: input='/home/ubuntu/public_html/archive/storage/aaa.jpg' pattern='!-f' => matched
[Sun Jul 12 00:05:16.006291 2020] [rewrite:trace2] [pid 15694] mod_rewrite.c(482): [client xxx.xxx.xxx.xxx:61496] xxx.xxx.xxx.xxx - - [hoge.jp/sid#7f7a55236f10][rid#7f7a551bc0a0/initial] [perdir /home/ubuntu/public_html/archive/] rewrite 'storage/aaa.jpg' -> 'http://xxx.xxx.xxx.xxx:8080/storage/aaa.jpg'
[Sun Jul 12 00:05:16.006297 2020] [rewrite:trace2] [pid 15694] mod_rewrite.c(482): [client xxx.xxx.xxx.xxx:61496] xxx.xxx.xxx.xxx - - [hoge.jp/sid#7f7a55236f10][rid#7f7a551bc0a0/initial] [perdir /home/ubuntu/public_html/archive/] escaped URI in per-dir context for proxy, http://xxx.xxx.xxx.xxx:8080/storage/aaa.jpg -> http://xxx.xxx.xxx.xxx:8080/storage/aaa.jpg
[Sun Jul 12 00:05:16.006308 2020] [rewrite:trace2] [pid 15694] mod_rewrite.c(482): [client xxx.xxx.xxx.xxx:61496] xxx.xxx.xxx.xxx - - [hoge.jp/sid#7f7a55236f10][rid#7f7a551bc0a0/initial] [perdir /home/ubuntu/public_html/archive/] forcing proxy-throughput with http://xxx.xxx.xxx.xxx:8080/storage/aaa.jpg
[Sun Jul 12 00:05:16.006314 2020] [rewrite:trace1] [pid 15694] mod_rewrite.c(482): [client xxx.xxx.xxx.xxx:61496] xxx.xxx.xxx.xxx - - [hoge.jp/sid#7f7a55236f10][rid#7f7a551bc0a0/initial] [perdir /home/ubuntu/public_html/archive/] go-ahead with proxy request proxy:http://xxx.xxx.xxx.xxx:8080/storage/aaa.jpg [OK]
[Sun Jul 12 00:05:16.006350 2020] [core:info] [pid 15694] [client xxx.xxx.xxx.xxx:61496] AH00128: File does not exist: proxy:http://xxx.xxx.xxx.xxx:8080/storage/aaa.jpg

EC2のApacheの手動設定内容(主要箇所抜粋・ファイル混在)

<VirtualHost *:80>
        DocumentRoot /home/ubuntu/public_html
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<IfModule mod_ssl.c>
   <VirtualHost _default_:443>
      DocumentRoot /home/ubuntu/public_html
   </VirtualHost>
</IfModule>

<Directory "/home/ubuntu/public_html">
    AllowOverride All
    Options ExecCGI MultiViews SymLinksIfOwnerMatch IncludesNoExec
    Require all granted
    AddHandler cgi-script .cgi .pl 
</Directory>
  • AWS・・・EC2,Ubuntu18.04(Debian10),Apache/2.4.29
  • 自宅サーバー・・・Raspberry Pi3,OSMC(Debian9.12),Apache/2.4.25
  • 自宅サーバーのselinuxを一時的にオフにしても変化なし
  • .htaccessのRewriteRuleのオプションを[L,P]から[L]または[L,R]にして普通にリダイレクトさせれば画像が見れる
  • AWSにアクセスして404が返ってきたとき,自宅サーバーのApacheのログには何も記録されていない
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

リバースプロキシを使うにはApacheのproxyモジュールを有効化する必要がありました.

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo systemctl restart apache2

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る