我正在使用 NGINX 来提供静态文件。
每当文件不存在时,我希望 NGINX 能够访问一个 nodejs 后端服务,该服务将尝试异步地检索该文件。
后端服务需要 3 个参数:全局唯一标识符, 这尺寸和扩大文件的。所有这些参数都是使用正则表达式从原始请求中检索的。
以下是我当前的 NGINX 配置文件:
server {
listen 80;
server_name .example.com;
root /var/www;
## Serves file (matching pattern: /<size>/<MEDIA>/<file na-me><.ext>)
location / {
location ~* ^/(\d+x\d+)/(([\w])([\w])([\w])[-\w]+)/[^\.]+\.(\w+)$ {
try_files /$3/$4/$5/$2/$1.$6 @backend/$2/$1/$6;
}
}
## backend service
location @backend {
proxy_pass http://127.0.0.1:8080;
}
}
但我一直收到这个错误:
2012/01/23 11:53:31 [error] 28354#0: *1 could not find named location "@backend/ed3269d1-f9ef-4Ffc-dbea-5982969846c0/200x240/jpg", client: XXX.XXX.XXX.XXX, server: example.com, request: "GET /200x240/ed3269d1-f9ef-4Ffc-dbea-5982969846c0/my%20fil.jpg HTTP/1.1", host: "3.example.com"
你知道如何让 NGINX 将请求“代理”到后端服务而不是寻找文件吗?
答案1
如果您使用命名捕获进行捕获,则可以使用它们在命名位置重写请求:
server {
listen 80;
server_name .example.com;
root /var/www;
## Serves file (matching pattern: /<size>/<MEDIA>/<file na-me><.ext>)
location / {
## ?<name> assigns the capture to variable $name
location ~* ^/(?<size>\d+x\d+)/(?<guid>([\w])([\w])([\w])[-\w]+)/[^\.]+\.(?<ext>\w+)$ {
try_files /$3/$4/$5/$2/$1.$6 @backend;
}
}
## backend service
location @backend {
## rewrite ... break; just sets $uri and doesn't perform a redirect.
rewrite ^ /$guid/$size/$ext break;
proxy_pass http://127.0.0.1:8080;
}
}