我得到了一個/api/{UUID}由不受我控制的后端服務的作業。
我需要添加一個/download/{UUID}服務相同的內容,但保存一個擴展名為 .json 的檔案
我試過了:
location ~ "^/download/([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$" {
rewrite /download/(.*) /api/$1 break;
set $id $1;
set $fname '${id}.json';
add_header Content-Disposition 'attachment; filename="$fname"';
proxy_pass http://localhost:8081;
}
但下載的檔案總是缺少擴展名。我做錯了什么?
uj5u.com熱心網友回復:
原因是來自ngx_http_rewrite_module. 雖然大部分情況下 nginx 配置是宣告性的,但來自 rewrite 模塊的指令是命令式的,并且按照出現的順序執行。該指令中break的標志rewrite使 nginx 停止執行來自 rewrite 模塊的任何進一步指令,這使得您的set陳述句根本不會被執行。您可以更改這些指令的順序:
location ~ "^/download/([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$" {
set $id $1;
set $fname '${id}.json';
rewrite /download/(.*) /api/$1 break;
add_header Content-Disposition 'attachment; filename="$fname"';
proxy_pass http://localhost:8081;
}
但是我認為使用命名捕獲會更簡單:
location ~ "^/download/(?<id>[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$" {
rewrite ^ /api/$id break;
add_header Content-Disposition 'attachment; filename="$id.json"';
proxy_pass http://localhost:8081;
}
甚至這樣:
location ~ "^/download/(?<id>[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})$" {
add_header Content-Disposition 'attachment; filename="$id.json"';
proxy_pass http://127.0.0.1:8081/api/$id;
}
(我127.0.0.1在這里使用了代替,localhost或者此配置需要將主機名resolver決議為IP 地址。是的,有時使用代替會使某些事情有所不同。)localhost127.0.0.1localhost127.0.0.1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/495828.html
標籤:nginx
