diff --git a/internal/bootstrap/data/setting.go b/internal/bootstrap/data/setting.go index 4636cd3b..af3730d8 100644 --- a/internal/bootstrap/data/setting.go +++ b/internal/bootstrap/data/setting.go @@ -136,6 +136,7 @@ func InitialSettings() []model.SettingItem { Type: conf.TypeText, Group: model.GLOBAL, Flag: model.PRIVATE}, {Key: conf.OcrApi, Value: "https://api.nn.ci/ocr/file/json", Type: conf.TypeString, Group: model.GLOBAL}, {Key: conf.FilenameCharMapping, Value: `{"/": "|"}`, Type: conf.TypeText, Group: model.GLOBAL}, + {Key: conf.ForwardDirectLinkParams, Value: "false", Type: conf.TypeBool, Group: model.GLOBAL}, // aria2 settings {Key: conf.Aria2Uri, Value: "http://localhost:6800/jsonrpc", Type: conf.TypeString, Group: model.ARIA2, Flag: model.PRIVATE}, diff --git a/internal/conf/const.go b/internal/conf/const.go index 52e54ed1..b5280d31 100644 --- a/internal/conf/const.go +++ b/internal/conf/const.go @@ -30,15 +30,16 @@ const ( VideoAutoplay = "video_autoplay" // global - HideFiles = "hide_files" - CustomizeHead = "customize_head" - CustomizeBody = "customize_body" - LinkExpiration = "link_expiration" - SignAll = "sign_all" - PrivacyRegs = "privacy_regs" - OcrApi = "ocr_api" - FilenameCharMapping = "filename_char_mapping" - + HideFiles = "hide_files" + CustomizeHead = "customize_head" + CustomizeBody = "customize_body" + LinkExpiration = "link_expiration" + SignAll = "sign_all" + PrivacyRegs = "privacy_regs" + OcrApi = "ocr_api" + FilenameCharMapping = "filename_char_mapping" + ForwardDirectLinkParams = "forward_direct_link_params" + // index SearchIndex = "search_index" AutoUpdateIndex = "auto_update_index" diff --git a/server/handles/down.go b/server/handles/down.go index 373c52cb..a97f700f 100644 --- a/server/handles/down.go +++ b/server/handles/down.go @@ -2,6 +2,7 @@ package handles import ( "fmt" + "net/url" stdpath "path" "strings" @@ -9,6 +10,7 @@ import ( "github.com/alist-org/alist/v3/internal/driver" "github.com/alist-org/alist/v3/internal/fs" "github.com/alist-org/alist/v3/internal/model" + "github.com/alist-org/alist/v3/internal/setting" "github.com/alist-org/alist/v3/internal/sign" "github.com/alist-org/alist/v3/pkg/utils" "github.com/alist-org/alist/v3/server/common" @@ -27,6 +29,7 @@ func Down(c *gin.Context) { Proxy(c) return } else { + link, _, err := fs.Link(c, rawPath, model.LinkArgs{ IP: c.ClientIP(), Header: c.Request.Header, @@ -38,6 +41,23 @@ func Down(c *gin.Context) { } c.Header("Referrer-Policy", "no-referrer") c.Header("Cache-Control", "max-age=0, no-cache, no-store, must-revalidate") + if setting.GetBool(conf.ForwardDirectLinkParams) { + params := c.Request.URL.Query() + params.Del("sign") + u, err := url.Parse(link.URL) + if err != nil { + common.ErrorResp(c, err, 500) + return + } + values := u.Query() + for k := range params { + for i := range params[k] { + values.Set(k, params[k][i]) + } + } + u.RawQuery = values.Encode() + link.URL = u.String() + } c.Redirect(302, link.URL) } } @@ -71,6 +91,23 @@ func Proxy(c *gin.Context) { common.ErrorResp(c, err, 500) return } + if link.URL != "" && setting.GetBool(conf.ForwardDirectLinkParams) { + params := c.Request.URL.Query() + params.Del("sign") + u, err := url.Parse(link.URL) + if err != nil { + common.ErrorResp(c, err, 500) + return + } + values := u.Query() + for k := range params { + for i := range params[k] { + values.Set(k, params[k][i]) + } + } + u.RawQuery = values.Encode() + link.URL = u.String() + } err = common.Proxy(c.Writer, c.Request, link, file) if err != nil { common.ErrorResp(c, err, 500, true)