
特殊なイメージを準備する方法を知っているアプリケーションがあり、それを別のマシンで実行しています (イメージ サーバーとして使用しようとしています)。
これらの画像がアプリケーションによって準備され提供されると、/image/files/medium/562.jpg などのパブリックにアクセス可能なパスに物理的に保存され、それ以降のリクエストでアプリケーションが何度も実行されるのを防ぎます。
私のアプリケーションはフロント コントローラー パターンを実装しているので、アプリにリクエストを送信する必要があり/thumbnail/process/?qs=1&qs=2
ます/thumbnail.php
。
また、実際のサムネイル プロセッサの URL をエンド ユーザーから隠す必要があります。
この時点での流れは以下のようになります。
- エンドユーザーが次のような画像リクエストを行う
/picture/small/518.jpg
/image/files/small/518.jpg
実際にはフォルダーが存在しないため、Nginx がそれをキャッチして書き換えますpicture
。- 存在する場合
/image/files/small/518.jpg
、nginx はリクエストをアプリに渡すのではなく、それを直接処理する必要があります。 - そうでない場合(画像が存在しない場合)、nginxは再度書き換え(またはリダイレクト)し、次のようなカスタムURIでリクエストをアプリに渡す必要があります。
/thumbnail/process/?size=small&model=866
- また、ngnix は、画像リクエストでない場合は他のリクエストを受け入れず、すぐに 444 を返す必要があります。
そこで、nginx のカスタム ルールを記述してこれらの問題を解決しようとしましたが、うまくいきませんでした。すでに処理済みの画像には問題はありませんが、アプリケーションにリクエストを渡す代わりに、404 が見つからないという応答が生成されます。
この構成の何が問題なのか、何が見逃されているのかがわかりません。
server {
listen 127.0.0.1:80;
server_name image.mydomain.com;
root /var/www/public_html;
location / {
# I know if is evil.
# Don't pass request to the application if it's not a image request!
if ( $uri !~ ^/(image|picture|thumbnail)/(.*)$ ) {
return 444;
}
}
# Real request uri for image.
location ~ "^/picture/(small|medium|large)/([a-zA-Z0-9]).jpg$" {
set $size $1;
set $model $2;
rewrite ^ /image/files/$size/$model.jpg last;
}
location ~ "^/image/files/(small|medium|large)/([a-zA-Z0-9]).jpg$" {
try_files $uri /thumbnail/process/?size=$1&model=$2;
break;
}
location ~ ^/thumbnail/process/(.*)$ {
index index.php;
try_files $uri $uri/ /index.php?$args;
}
include fastcgi_config.conf;
}
fascgi_config.conf の内容:
fastcgi_intercept_errors on;
location ~ .php$ {
fastcgi_pass my-www-pool;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
#fastcgi_param REQUEST_URI $uri?$args;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
fastcgi_param REDIRECT_STATUS 200;