0

(对不起,我的英语不好)

我有一个这样的网址:

http://www.domain.com/resize.php?pic=images/elements/imagename.jpg&type=300crop

该 php 检查该图像是否存在并提供服务,如果不存在,则使用 type 参数中指定的大小在磁盘上创建图像并返回它。

我想要的是使用 nginx 检查磁盘上是否存在该大小的图像,因此仅在需要时运行 resize.php 来创建图像。

我试过这个,但我认为 location 指令不使用正则表达式对查询参数($args)进行操作,然后 loncation 与示例 URL 不匹配:(

请问有什么帮助吗?

我需要重写参数($args)并在 try_files 指令中使用它们……这可能吗?

location ~ "^/resize\.php\?pic=images/(elements|gallery)/(.*)\.jpg&type=([0-9]{1,3}[a-z]{0,4})$)" { 
  try_files /images/$1/$2.jpg /imagenes/elements/thumbs/$3_$2.jpg @phpresize;
}

location @phpresize {
  try_files $uri =404;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_buffering on;
  proxy_pass http://www.localhost.com:8080;
}
4

1 回答 1

1

您无法匹配查询字符串location(例如,请参见此处此处)。根据查询字符串内容以不同方式处理请求的唯一方法是使用if条件重写。

但是,如果可以/resize.php使用位置配置处理没有预期查询参数的请求@phpresize,您可以尝试以下操作:

map $arg_pic $image_dir {
    # A subdirectory with this name should not exist.
    default invalid;

    ~^images/(?P<img_dir>elements|gallery)/.*\.jpg$      $img_dir;
}

map $arg_pic $image_name {
    # The ".*" match here might be insecure - using something like "[-a-z0-9_]+"
    # would probably be better if it matches all your image names;
    # choose a regexp which is appropriate for your situation.
    ~^images/(elements|gallery)/(?P<img_name>.*)\.jpg$   $img_name;
}

map $arg_type $image_type {
    ~^(?P<img_type>[0-9]{1,3}[a-z]{0,4})$    $img_type;
}

location ~ "^/resize.php$" {
    try_files /images/${image_dir}/${image_name}.jpg /imagenes/elements/thumbs/${image_type}_${image_name}.jpg @phpresize;
}

location @phpresize {
    # No changes from your config here.
    try_files $uri =404;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_buffering on;
    proxy_pass http://www.localhost.com:8080;
}
于 2013-05-17T17:29:01.253 回答