
我有一個應用程序,它知道如何準備一些特殊圖像及其在單獨的計算機上運行(我正在嘗試將其用作圖像伺服器)。
當應用程式準備並提供這些圖像時,也會在心理上保存到可公開存取的路徑(例如 /image/files/medium/562.jpg),以防止根據進一步的請求一次又一次地運行應用程式。
我的應用程式實現了前端控制器模式,因此我需要將請求發送到我的應用程序,而/thumbnail/process/?qs=1&qs=2
不是/thumbnail.php
或類似的東西。
另外,我需要向最終用戶封鎖我的真實縮圖處理器 URL。
此時流程如下:
- 最終用戶發出圖像請求,例如
/picture/small/518.jpg
- Nginx 捕獲它並重寫,
/image/files/small/518.jpg
因為實際上不存在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;