最近、CentOS 7マシンのWebサーバーをApacheからnginxに切り替えました。ソフトウェアを使用して自分のコンピューターでスクリーンショットを撮り、サーバーにアップロードして公開します。元々、Apacheでは問題なく動作しましたが、現在、nginxがWebサーバー上の一部の.png画像に対して404エラーを出力するという問題に直面しています。
私は この質問 を非常に類似した問題で参照しましたが、私自身の問題のコンテキストでは解決策を理解できませんでした。
以下の画像サーバーのサーバーブロックのスニペットがあります。
server {
listen 80;
server_name imageserver.example.com;
root /usr/share/nginx/imageserver.example.com/public_html;
access_log imageserver.example.com/logs/imageserver.example.com_access.log;
error_log imageserver.example.com/logs/imageserver.example.com_error.log crit;
location / {
index index.html index.htm;
}
location ~* \.png {
root imageserver.example.com/public_html/u/;
expires max;
add_header Pragma public;
add_header Cache-control "public, must revalidate, proxy-revalidate";
}
}
リンクの例は この画像 です。ファイルがサーバー上に存在することを確認しました。次の権限があります。
$ lsa 7b724394b851299c68b15f1172f158c6.png -rw-rw-r--. 1 jflory nginx 2.4K Nov 3 11:13 7b724394b851299c68b15f1172f158c6.png
これを修正する方法について私は非常に混乱しています。問題は何でしょうか?
location ~* \.png
コンテナのroot
ディレクティブがURLの末尾に/ u /を追加しているため、サーバーは/ u/u /で画像を探しています。
root
ブロックで定義された値から値が継承されるため、このserver
ディレクティブは実際には不要です。
画像ファイルは/ u /ではなく、ルートディレクトリにあります。
リンクの/ uを削除すると、画像が読み込まれます。
しかし、好奇心旺盛ですが、/ u /がイメージのルートディレクトリではないでしょうか。なぜこれがそれを直したのか、私にはよくわかりません。
public_html
ディレクトリのパスのみを指定する必要があります。理解するには、次の例を参照してください。
ファイル構造:
.../public_html/
-- /u/myimg.jpg
-- /index.html
画像をindex.html
で表示するコード:
<img src="/u/myimg.jpg">
したがって、画像サーバーのパスとして.../public_html/u/
を設定すると、サーバーは.../public_html/u/u/myimg.jpg
を見つけようとするため、404エラーがスローされます。お役に立てれば :)