package rules import ( "net/url" ) // trackingParameters is a set of query parameter names that should be removed from URLs var trackingParameters = map[string]struct{}{ "utm_source": {}, // UTM parameter - marketing campaign source "utm_medium": {}, // UTM parameter - marketing campaign medium "utm_campaign": {}, // UTM parameter - marketing campaign name "utm_term": {}, // UTM parameter - marketing campaign term "utm_content": {}, // UTM parameter - marketing campaign content "fbclid": {}, // Facebook click ID "gclid": {}, // Google click ID "ref_src": {}, // Twitter/X referrer source "ref_url": {}, // Twitter/X referrer URL } // CleanURL removes tracking and social network parameters from a URL. // Other query parameters are preserved. If the URL cannot be parsed, it returns the original URL. func CleanURL(urlStr string) string { parsedURL, err := url.Parse(urlStr) if err != nil { // If URL cannot be parsed, return original return urlStr } // If there are no query parameters, return original URL if parsedURL.RawQuery == "" { return urlStr } // Parse query parameters query := parsedURL.Query() // Remove tracking parameters for param := range trackingParameters { query.Del(param) } // Reconstruct URL with cleaned query parameters parsedURL.RawQuery = query.Encode() // If all query parameters were removed, clear the query string if parsedURL.RawQuery == "" { parsedURL.RawQuery = "" } return parsedURL.String() }