{"record":{"id":"ba64e40b024ffe19","repo":"nats-io/nats-server","slug":"invalid-domain-name-may-not-contain-or","errorCode":null,"errorMessage":"invalid domain name: may not contain ., * or >","messagePattern":"invalid domain name: may not contain \\., \\* or >","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/jetstream.go","lineNumber":2933,"sourceCode":"\t\t\t}\n\t\t\tif a == sacc {\n\t\t\t\treturn fmt.Errorf(\"system account %q can not be in default_js_domain\", a)\n\t\t\t}\n\t\t\tif d == _EMPTY_ {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif sub := fmt.Sprintf(jsDomainAPI, d); !IsValidSubject(sub) {\n\t\t\t\treturn fmt.Errorf(\"default_js_domain contains account %q with invalid domain name %q\", a, d)\n\t\t\t}\n\t\t}\n\t}\n\tif o.JetStreamDomain != _EMPTY_ {\n\t\tif subj := fmt.Sprintf(jsDomainAPI, o.JetStreamDomain); !IsValidSubject(subj) {\n\t\t\treturn fmt.Errorf(\"invalid domain name: derived %q is not a valid subject\", subj)\n\t\t}\n\n\t\tif !isValidName(o.JetStreamDomain) {\n\t\t\treturn fmt.Errorf(\"invalid domain name: may not contain ., * or >\")\n\t\t}\n\t}\n\t// If not clustered no checks needed past here.\n\tif !o.JetStream || o.Cluster.Port == 0 {\n\t\treturn nil\n\t}\n\tif o.ServerName == _EMPTY_ {\n\t\treturn fmt.Errorf(\"jetstream cluster requires `server_name` to be set\")\n\t}\n\tif o.Cluster.Name == _EMPTY_ {\n\t\treturn fmt.Errorf(\"jetstream cluster requires `cluster.name` to be set\")\n\t}\n\n\th := strings.ToLower(o.JetStreamExtHint)\n\tswitch h {\n\tcase jsWillExtend, jsNoExtend, _EMPTY_:\n\t\to.JetStreamExtHint = h\n\tdefault:","sourceCodeStart":2915,"sourceCodeEnd":2951,"githubUrl":"https://github.com/nats-io/nats-server/blob/3a66a489d262bf89b71a71c955c94920394532f3/server/jetstream.go#L2915-L2951","documentation":"After the subject-validity check, JetStreamDomain must also pass isValidName, which additionally forbids `.` (dots), `*` and `>` (wildcards). A domain is a single plain token, not a subject; wildcard or dotted values would create ambiguous API subjects and are rejected at startup.","triggerScenarios":"Setting `jetstream_domain` (or a default_js_domain entry passing the subject check but failing isValidName) to a value containing `.`, `*`, or `>` — e.g. `\"us.*\"` or `\"east.west\"`.","commonSituations":"Operators confusing domains with subjects and using wildcards; building hierarchical domain names with dots; copying a subject string into a domain field.","solutions":["Remove `.`, `*`, and `>` characters from the `jetstream_domain` value, using a single plain token like `east` or `us-east`.","Use hyphens or underscores instead of dots for structure in the domain name.","Restart the server after fixing the config."],"exampleFix":"// before\njetstream_domain: \"us.*\"\n// after\njetstream_domain: \"us-east\"","handlingStrategy":"validation","validationCode":"var validDomain = regexp.MustCompile(`^[^.*>\\s]+$`)\nif cfg.JetStreamDomain != \"\" && !validDomain.MatchString(cfg.JetStreamDomain) {\n    return fmt.Errorf(\"jetstream_domain may not contain ., * or >\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat domains as single tokens: no dots, no wildcards.","Document the allowed character set for operators.","Add a config linter rule rejecting `.`/`*`/`>` in domain fields."],"tags":["jetstream","configuration","domain"],"backgroundTag":"invalid-server-config","analyzedSha":"3a66a489d262bf89b71a71c955c94920394532f3","analyzedAt":"2026-09-02T04:41:54.247Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}