mango00000
@mango00000

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

パスがあっているのにサイトで画像が表示されない

最近onamae.comにてドメインを取得し、Xfreeというサーバーを使ってサイトを公開しました。

その後、CloudflareでサイトをSSL化できると聞いてやってみました。
ブラウザとCloudflare間のトラフィックを暗号化できるFlexible(フレキシブル)というものを使用しました。

ですが、次の日に自分のサイトを見ると画像が読み込まれていませんでした。
デベロッパーツールのconsoleを見ると403エラーが出ていました。
?と思ってGETできなかったurlにアクセスすると画像が表示されました。
は?と思ってサイトに戻ってリロードすると、あら不思議、画像表示されました。

そんか感じでその後も何回もあり、その度に画像のurlにアクセスして表示できるようにしました。

まだ治っていないのですがなぜでしょうか?
よくわからないので教えてください。

0

2Answer

Cloudflare とか触ったこともないので想像ですが・・・

ですが、次の日に自分のサイトを見ると画像が読み込まれていませんでした。デベロッパーツールのconsoleを見ると403エラーが出ていました。

403 エラーには「403.4 - SSLが必要」が含まれています。詳しくは以下の記事を見てください。

SSL 必須にされているリソースを 非 SSL (http) で要求するとそのエラーが出ます。IIS の例ですが、以下の記事に書いてある設定で SSL 必須にできます。

なので、疑わしいのは、問題の画像表示用の img 要素の src 属性が src="http://example.com/image.png" のようになっていることです。

確認してみてください。

?と思ってGETできなかったurlにアクセスすると画像が表示されました。

どうやって呼んだのか書いてないのでわかりませんが、https で呼んだのでは? http だと同様に 403.4 エラーになるはずです。

は?と思ってサイトに戻ってリロードすると、あら不思議、画像表示されました。

上の操作で表示された画像がブラウザにキャッシュされたのでリロードで表示できたのではないかと思います。

0Like

Comments

  1. @mango00000

    Questioner

    なので、疑わしいのは、問題の画像表示用の img 要素の src 属性が >src="http://example.com/image.png" のようになっていることです。

    確認しましたがimg要素のsrc属性はimage.pngのように相対パスになっていたので、http~~をGETしようとしたわけではないと思います。

    また、先ほども質問させていただいた通りのことが起こりました。

    これがなんの意味があるかはわかりませんが、同じようにGETできなかった画像urlにアクセスした後、
    Command + Shift + rでスーパーリロードしてみました。
    すると今まで同様表示されました。

    Cloudflareの何かが原因なのかもしれませんが、何か原因と予想されることがありましたら教えていただければ幸いです。

公式ドキュメントに各エラーコード時の説明があります。

403 Forbidden の項目にある通り、まずは「Cloudflareのブランディングを含む403か」の切り分けをしましょう。
(Flexible=Cloudflareとオリジン間は非SSLだと思うので、おそらくCloudflare側403だとは思いますが念のため…)

見分け方としては、ドキュメントにある通り「レスポンス本文に Cloudflare を含むか」で判断できそうです。(ブラウザのタブ画面で 403 が表示された際にCloudflareと書かれているか、apacheやnginx等のhttpサーバごとのエラーページか、もしくはオリジンサーバ独自のエラーページか…で見分けがつくと思います)

切り分けが出来たら、それぞれの問題になりそうな項目も公式ドキュメントにいくつか例示されています。
ただし日本語版はおそらく機械翻訳の都合上か、特にCloudflare側403だった場合の説明のリンクが切れてしまっているため、英語版でも確認した方がよさそうです。

(WAF Custom or Managed RulesSecurity Level 等、関連しそうな項目の詳細ページへのリンクが明確でよい)

0Like

Comments

  1. デベロッパーツールのconsoleを見ると403エラーが出ていました。
    ?と思ってGETできなかったurlにアクセスすると画像が表示されました。

    もしも画像URLに直接アクセスすると403が出ずに即座に表示されたということであれば
    最初からデベロッパーツールのネットワークタブを表示した状態で、サイト表示を試みるとよいです。

    403になった画像の項目があれば、選択すると詳細なリクエストやレスポンスも表示可能で、「Cloudflareのブランディングを含む403か」の確認に使えると思います。
    (ここにある他の情報も原因追及に役立つかもしれません)

  2. @mango00000

    Questioner

    デベロッパーツールのネットワークタブを確認しましたところ、レスポンスヘッダーServerの値がcloudflareになっていたのでおそらくCloudflareの問題かと思われます。

    個人的に考えているのは、Xfreeが暗号化に対応していないのが原因ではないかと思っております。

    また考えていて思ったのが、なぜ画像だけが403エラーになるのか、サイトを見て読み込まれていない画像のところを見ると毎回同じところが表示されていません。ここは表示されるけど、ここは表示されないというような感じになっています。

    そして何よりひらめいた?と思ったのが、HTMLのimgに最初から書いてあるような画像は全て読み込まれていることです。

    <img src="images/image.png">
    

    のような画像は全て表示されているのですが、Javascriptでimg要素を作ってそのsrc属性に対して値を当てはめているようなコードの画像は表示されないことがあるということです。

    const post_image = document.createElement('img');
    post_image.src = post.image;
    
  3. 横レス失礼

    Javascriptでimg要素を作ってそのsrc属性に対して値を当てはめているようなコードの画像は表示されないことがあるということです。

    そういうことは質問を書く前に調べて最初に質問に書いてほしかったですね。

    ブラウザのキャッシュを全部削除してから、Fiddler やブラウザの開発ツールなどを使って要求・応答をキャプチャできるように設定して、問題のページを要求してみてはいかがですか?

    問題なく画像が取得できる場合の要求・応答と、403 エラーでダメな場合の違いを比較すれば、ヒントが見つかるのではないかと思います。

  4. @mango00000

    Questioner

    今になって気づいたのですが、表示されない場合がある画像は全てpngなのに対し、いつも表示されているのがwebpです。(最初に気づくべきでした)

    あとデベロッパーツールネットワークにて、キャッシュを無効の状態で収集した表示された画像とされなかった画像のデータを載せます。(ヘッダのところを全て確認しました。)

    表示された画像をA、表示されなかった画像をBとします。
    また、二つの画像はどっちもpngでした。

    Aだけにあったプロパティと値

    Accept-Ranges:bytes 
    Age:215 
    Cache-Control:max-age=14400
    Content-Length:8312
    Etag:"20e00473-2078-606059d674a7a"
    Last-Modified:Sat, 23 Sep 2023 12:10:45 GMT
    

    Bだけにあったプロパティと値

    Content-Encoding:br
    

    違ったところ

    Cf-Cache-Status Cf-Ray Content-Type Report-To
    A HIT 80b9f995b901b012-NRT image/png {"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v3?s=KRecmX9WN177QOIqD9QZFtYvvQIQ%2BR1oTtyya6A4e3I4OwWrHWZWccW9ymtVr3qtErkMcATk%2FSbLK37HpCE2ZN%2BLmWVw8svNfWfSL9A%2BfQwYd3B39J5qj9Md9knK37rzzK0H9PDw%2By2y3Mk%3D"}],"group":"cf-nel","max_age":604800}
    B BYPASS 80b9f3f309af3c17-NRT text/html charset=iso-8859-1 {"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v3?s=8av5A5j2QYgOICGtrA13YrwSMkWDRbQ0%2FQimByVU%2FNL4T4XmafQXiKJUnp%2FRqFzcrxRjIIWHceH%2ByFltSEJ9%2B6XzIMLxL3MQhgSNR7s%2FfsNGicoQhJMoPbXKrJeesyQe49Ccl9Og7lnLzi0%3D"}],"group":"cf-nel","max_age":604800}
  5. @mango00000

    Questioner

    先ほどサーバー上の全てのpng画像をwebpに置き換えました。
    これで一旦数日見守ってみます。

Your answer might help someone💌