![奇怪的 nginx 配置:多个重写规则不起作用](https://linux22.com/image/622301/%E5%A5%87%E6%80%AA%E7%9A%84%20nginx%20%E9%85%8D%E7%BD%AE%EF%BC%9A%E5%A4%9A%E4%B8%AA%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我有一个应用程序知道如何准备一些特殊的图像并且它在单独的机器上运行(我正尝试将其用作图像服务器)。
当应用程序准备好并提供这些图像时,也会在物理上保存到可公开访问的路径中,例如 /image/files/medium/562.jpg,以防止在进一步的请求中一遍又一遍地运行应用程序。
我的应用程序实现了前端控制器模式,所以我需要以/thumbnail/process/?qs=1&qs=2
不/thumbnail.php
或类似的方式向我的应用程序发送请求。
另外,我需要向最终用户隐藏我的真实缩略图处理器网址。
此时流程如下:
- 最终用户发出如下图像请求
/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;