我正在尝试创建一个下载脚本,该脚本捕获所有对/ 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。阻止,但这使得输出"没有指定输入文件" 。
我希望有人可以帮助我。
提前致谢。
答案 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;
}