diff --git a/app/vmalert/web.go b/app/vmalert/web.go
index 0f7567509c..0cdff3a2c7 100644
--- a/app/vmalert/web.go
+++ b/app/vmalert/web.go
@@ -168,7 +168,7 @@ func (rh *requestHandler) handler(w http.ResponseWriter, r *http.Request) bool {
 		if strings.HasPrefix(r.URL.Path, "/api/v1/") {
 			redirectURL = alert.APILink()
 		}
-		httpserver.RedirectPermanent(w, "/"+redirectURL)
+		httpserver.Redirect(w, "/"+redirectURL)
 		return true
 	}
 }
diff --git a/app/vmselect/main.go b/app/vmselect/main.go
index 0045e0c9b8..194d0a30f7 100644
--- a/app/vmselect/main.go
+++ b/app/vmselect/main.go
@@ -296,7 +296,7 @@ func selectHandler(qt *querytracer.Tracer, startTime time.Time, w http.ResponseW
 		_ = r.ParseForm()
 		suffix := strings.Replace(p.Suffix, "prometheus/", "../prometheus/", 1)
 		newURL := suffix + "/?" + r.Form.Encode()
-		httpserver.RedirectPermanent(w, newURL)
+		httpserver.Redirect(w, newURL)
 		return true
 	}
 	if strings.HasPrefix(p.Suffix, "vmui/") || strings.HasPrefix(p.Suffix, "prometheus/vmui/") {
@@ -350,7 +350,7 @@ func selectHandler(qt *querytracer.Tracer, startTime time.Time, w http.ResponseW
 
 	if p.Suffix == "prometheus/vmalert" {
 		path := "../" + p.Suffix + "/"
-		httpserver.RedirectPermanent(w, path)
+		httpserver.Redirect(w, path)
 		return true
 	}
 	if strings.HasPrefix(p.Suffix, "prometheus/vmalert/") {
diff --git a/lib/httpserver/httpserver.go b/lib/httpserver/httpserver.go
index 5beeef1e2d..14ad40ba4d 100644
--- a/lib/httpserver/httpserver.go
+++ b/lib/httpserver/httpserver.go
@@ -248,7 +248,7 @@ func handlerWrapper(s *server, w http.ResponseWriter, r *http.Request, rh Reques
 			// This is needed for proper handling of relative urls in web browsers.
 			// Intentionally ignore query args, since it is expected that the requested url
 			// is composed by a human, so it doesn't contain query args.
-			RedirectPermanent(w, prefix)
+			Redirect(w, prefix)
 			return
 		}
 		if !strings.HasPrefix(path, prefix) {
@@ -681,11 +681,14 @@ func GetRequestURI(r *http.Request) string {
 	return requestURI + delimiter + queryArgs
 }
 
-// RedirectPermanent redirects to the given url using 301 status code.
-func RedirectPermanent(w http.ResponseWriter, url string) {
+// Redirect redirects to the given url.
+func Redirect(w http.ResponseWriter, url string) {
 	// Do not use http.Redirect, since it breaks relative redirects
 	// if the http.Request.URL contains unexpected url.
 	// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2918
 	w.Header().Set("Location", url)
-	w.WriteHeader(http.StatusMovedPermanently)
+	// Use http.StatusFound instead of http.StatusMovedPermanently,
+	// since browsers can cache incorrect redirects returned with StatusMovedPermanently.
+	// This may require browser cache cleaning after the incorrect redirect is fixed.
+	w.WriteHeader(http.StatusFound)
 }