如何根据标题参数dynamic改变文件名 – nginx rewrite

我正在使用nginx web服务器提供.pdf文件。 并根据title args使用重写规则设置.pdf文件的文件名。

我想要做的是,将我的域名example.com添加到文件名中

1.如果title var包含example.com ,则使用title var数据作为文件名。

例如

 URL : http://example.com/pdf/0D2E8C9DC2F732A6ACC6150811515F697E3C376C.pdf?title=[example.com]ebook Filename : [example.com]ebook.pdf 

2.如果title var中没有包含example.com ,则将文件名作为[example.com]title var.pdf

例如

 URL : http://example.com/pdf/0D2E8C9DC2F732A6ACC6150811515F697E3C376C.pdf?title=ebook Filename : [example.com]ebook.pdf 

3.如果标题没有设置,则使用文件名作为[example.com]hash.pdf文件名。

例如

 URL : http://example.com/pdf/0D2E8C9DC2F732A6ACC6150811515F697E3C376C.pdf Filename : [example.com]0D2E8C9DC2F732A6ACC6150811515F697E3C376C.pdf 

我怎样才能达到这样的东西。 ?


我目前的configuration看起来像这样

 #pdf download block location ~* /pdf/([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F]+)\.pdf$ { #if title is not set then use hash.pdf as filename if ( $arg_title = '' ) { add_header Content-Disposition 'attachment; filename="[example.com]$1$2$3$4$5$6.pdf"'; } add_header Content-Disposition 'attachment; filename="[example.com]$arg_title.pdf"'; alias /var/www/example.com/pdf/$1/$2/$3/$4/$5/$1$2$3$4$5$6.pdf; expires 1y; } 

上面的代码工作正常,只有当标题var没有被设置,但如果我设置标题var作为[example.com]ebook.pdf它再次添加域名和最终文件名变成

 [example.com][example.com]ebook.pdf 

据我所知,我们可以假设,如果在$arg_titlevariables的开始处有一个[example.com]子string,我们可以安全地将其切断。 所以这里是你需要的configuration:

 location ~* /pdf/([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F]+)\.pdf$ { #First of all we should put pdf path from the request into a variable, #since $1,$2,$n would contain other data later: set $hashpath $1/$2/$3/$4/$5/$1$2$3$4$5$6; #Same applies to hash title: set $hashtitle $1$2$3$4$5$6; #Now we try to get the title argument without getting [example.com] in the beginning: if ( $arg_title ~ "^(\[example\.com\])?(.*)$") { #This way if title contained [example.com], it would go to $1 variable, while $2 has our new cleaned title: set $pdftitle $2; } #now we check if title was empty: if ( $arg_title = '' ) { #and assign our title that $hashtitle variable we got from the request earlier: set $pdftitle $hashtitle; } #also we check if title has only [example.com] without anything else: if ( $arg_title = '[example.com]' ) { set $pdftitle $hashtitle; } #After that we can safely put [example.com] in front of our filename, without worrying that there would be a double: add_header Content-Disposition 'attachment; filename="[example.com]$pdftitle.pdf"'; alias /var/www/example.com/pdf/$hashpath.pdf; expires 1y; } 

在这里使用nginx 1.9.12:

标题= [example.com]试验

标题= just_test

标题未设置

与实际的文件在这里