web-dev-qa-db-ja.com

nginxはphpスクリプトを介して画像を提供します

私はnginxの経験があまりないので、vhostの設定で少し迷っています。基本的に私のアプリは、phpスクリプトを介していくつかの画像を提供する場合、これはApacheで非常に簡単です。物理的な画像を探します->見つからない場合は、リクエスト文字列をparamsとしてindex.phpにすべてをプッシュします。いいえ、私はこのアプリをnginxで実行しようとしていますが、スクリプトを介して提供される画像以外はすべて機能します(404が表示されるだけです)。これがnginxの私のvhostです:

server {
    listen 80;

    server_name ~^(www\.)?(?<sname>.+?).subdomain.domain.com$;
    root /var/www/$sname/current/public;
    index index.html index.htm index.php;

    location / {
            try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
            add_header        Cache-Control public;
            add_header        Cache-Control must-revalidate;
            expires           7d;
    }

    location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            include fastcgi_params;
            fastcgi_index index.php;
    }

    location ~ /\.ht {
            deny all;
    }

}

物理的な場所で画像を探しているだけのようです。これは実際の物理的な画像では機能しますが、スクリプトで提供される動的な画像では機能しません。ヘルプやガイダンスは大歓迎です。

更新:わかりましたので、キャッシュ制御の場所から.jpgを削除すると機能しますが、それらの動的画像要求にキャッシュヘッダーを設定したいので、php経由で実行してキャッシュを設定するにはどうすればよいですかその後のヘッダー?

3
Auris

次のlocationブロックを画像に使用できます。

location ~* \.(jpg|jpeg|gif|png|bmp)$ {
    try_files $uri $uri/ /index.php$is_args$args;

    add_header        Cache-Control public;
    add_header        Cache-Control must-revalidate;
    expires           7d;
}

最初の質問では必要なパラメーターが明確に示されていないため、スクリプトの正しいパラメーターを取得するには、/index.php?$is_args$args行のtry_files部分を変更する必要がある場合があります。

次に、残りのキャッシュオプションについて、次のlocationブロックを使用します。

location ~* \.(ico|pdf|flv|swf|exe|html|htm|txt|css|js)$ {
    add_header        Cache-Control public;
    add_header        Cache-Control must-revalidate;
    expires           7d;
}

また、$を正規表現一致文字列に追加して、拡張子で終了するリクエストのみがそのブロックで処理されるようにしました。たとえば、初期構成では、URL https://example.com/path/image.jpg75783は、キャッシュディレクティブを指定するlocationブロックによって処理されます。

別の方法は、画像キャッシュヘッダーをPHPスクリプトに設定することです。

2
Tero Kilkanen

すべてのURIにヘッダーと有効期限を追加するには、serverブロックにステートメントを配置する必要があります。その場合、それらはすべてのロケーションブロックに継承されます。例えば:

server {
    ...

    add_header        Cache-Control public;
    add_header        Cache-Control must-revalidate;
    expires           7d;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        ...
    }

    location ~ /\.ht {
        deny all;
    }
}
0
Richard Smith