(抱歉我的英语不好)
我有这样的网址:
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;
}
答案 0 :(得分:1)
您无法匹配location
中的查询字符串(例如,请参阅here和here)。根据查询字符串内容处理请求的唯一方法是使用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;
}