nginx:php文件扩展名不适用于try_files

时间:2016-08-12 06:31:58

标签: php nginx

我正在尝试创建一个下载脚本,该脚本捕获所有对/ files /的请求并强制下载。该脚本完全有效,并下载我抛出的任何文件。问题是,当我尝试通过try_files传递扩展名为.php的文件时,以下nginx配置会混乱:

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。阻止,但这使得输出"没有指定输入文件"

我希望有人可以帮助我。

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

有关详细信息,请参阅this document

尝试:

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

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

答案 1 :(得分:0)

根据nginx最佳实践,您应该隔离正则表达式位置:

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

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