2016-08-12 23 views
1

我正在尝试制作一个下载脚本,它可以捕获/ files /的所有请求并强制下载。该脚本完全有效,并下载任何文件,我扔在它。问题是,当我试图通过一个文件通过try_files .php扩展名,以下nginx的配置弄乱了:nginx:php文件扩展名不能与try_files一起使用

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    listen 443 ssl; 
    listen [::]:443 ssl; 

    server_name _; 

    root /var/www/localhost/public_html/; 
    index index.php index.html index.htm index.txt; 


    location /files/ { 
     try_files $uri $uri/ /.thedownloadscript.php?file=$uri; 
    } 

    location ~ \.php$ { 
    try_files $uri =404; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_param SCRIPT_FILENAME /public_html$fastcgi_script_name;  

    include fastcgi_params; 
    } 

    ssl_certificate /var/www/server.crt; 
    ssl_certificate_key /var/www/server.key; 
} 

/files/file.txt下载文件。

/files/script.php抛出一个404

两个路径应该传递给下载脚本,但都没有。

我试图从“位置〜.php $”块中删除try_files,但这使得它输出“没有指定输入文件”

我希望有人能帮助我。

在此先感谢。

回答

0

任何正则表达式位置块优先于相同级别的前缀位置块,除非后者使用^~修饰符。

查看this document了解详情。

尝试:

location ^~ /files/ { 
    try_files $uri $uri/ /.thedownloadscript.php?file=$uri; 
} 

注意,location ^~ /files/块是一个前缀位置(而不是一个正则表达式的位置)。

+0

谢谢,这个工程完全按照我想让它。 – Yani

0

根据nginx的最佳做法,应隔离正则表达式的位置:

location/{ 
    location ~ \.php$ { 
     ... 
    } 
} 

location /files/ { 
    try_files $uri $uri/ /.thedownloadscript.php?file=$uri; 
}