有关使用正则表达式的位置内的try_files上的$ args的问题

时间:2013-05-08 15:38:08

标签: nginx location rewrite args

(抱歉我的英语不好)

我有这样的网址:

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;
}

1 个答案:

答案 0 :(得分:1)

您无法匹配location中的查询字符串(例如,请参阅herehere)。根据查询字符串内容处理请求的唯一方法是使用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;
}