2016-08-12 50 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; 
}