web-dev-qa-db-ja.com

nginx Webサーバーに存在するファイルの404を受信する

最近、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

これを修正する方法について私は非常に混乱しています。問題は何でしょうか?

4
Justin W. Flory

location ~* \.pngコンテナのrootディレクティブがURLの末尾に/ u /を追加しているため、サーバーは/ u/u /で画像を探しています。

rootブロックで定義された値から値が継承されるため、このserverディレクティブは実際には不要です。

4
Richard Smith

画像ファイルは/ u /ではなく、ルートディレクトリにあります。

リンクの/ uを削除すると、画像が読み込まれます。

2
Gmck

しかし、好奇心旺盛ですが、/ 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エラーがスローされます。お役に立てれば :)

2
Dinkar