51 lines
1.5 KiB
Go
51 lines
1.5 KiB
Go
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()
|
|
}
|