diff --git a/CHANGELOG.md b/CHANGELOG.md index f00e6934..0a1d671b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,8 @@ systemctl start headscale [#2625](https://github.com/juanfont/headscale/pull/2625) - Don't crash if config file is missing [#2656](https://github.com/juanfont/headscale/pull/2656) +- Adds `/robots.txt` endpoint to avoid crawlers + [#2643](https://github.com/juanfont/headscale/pull/2643) ## 0.26.1 (2025-06-06) diff --git a/hscontrol/app.go b/hscontrol/app.go index 2bc42ea0..ec8e2550 100644 --- a/hscontrol/app.go +++ b/hscontrol/app.go @@ -449,6 +449,7 @@ func (h *Headscale) createRouter(grpcMux *grpcRuntime.ServeMux) *mux.Router { router.HandleFunc(ts2021UpgradePath, h.NoiseUpgradeHandler). Methods(http.MethodPost, http.MethodGet) + router.HandleFunc("/robots.txt", h.RobotsHandler).Methods(http.MethodGet) router.HandleFunc("/health", h.HealthHandler).Methods(http.MethodGet) router.HandleFunc("/key", h.KeyHandler).Methods(http.MethodGet) router.HandleFunc("/register/{registration_id}", h.authProvider.RegisterHandler). diff --git a/hscontrol/handlers.go b/hscontrol/handlers.go index 590541b0..d6d32e6d 100644 --- a/hscontrol/handlers.go +++ b/hscontrol/handlers.go @@ -180,6 +180,21 @@ func (h *Headscale) HealthHandler( respond(nil) } +func (h *Headscale) RobotsHandler( + writer http.ResponseWriter, + req *http.Request, +) { + writer.Header().Set("Content-Type", "text/plain") + writer.WriteHeader(http.StatusOK) + _, err := writer.Write([]byte("User-agent: *\nDisallow: /")) + if err != nil { + log.Error(). + Caller(). + Err(err). + Msg("Failed to write response") + } +} + var codeStyleRegisterWebAPI = styles.Props{ styles.Display: "block", styles.Padding: "20px",