2016-06-01 6 views
2

Ich muss eine Route erstellen, die zwei Subdomains (prefix.api.example.com und prefix.api.sandbox.example.com) mit Gorilla mux Router entspricht. Bis jetzt habe ich die Regex unten, aber der Router gibt 404 auf Anfragen zurück. Irgendeine Idee warum ist das?Wie Subdomain mit Gorilla Mux übereinstimmen

router := mux.NewRouter() 
route := router.Host(`prefix.api{_:(^$|^\.sandbox$)}.example.com`) 

Mehr Code

package main 

import(
    "github.com/gorilla/mux" 
    "net/http" 
) 

type handler struct{} 

func (_ handler)ServeHTTP(w http.ResponseWriter, r *http.Request){ 
    w.Write([]byte("hello world")) 
    w.WriteHeader(200) 

} 
func main() { 
    router := mux.NewRouter().StrictSlash(true) 
    route := router.Host(`prefix.api{_:(^$|^\.sandbox$)}.example.com`) 
    route.Handler(handler{}) 
    http.Handle("/", router) 
     panic(http.ListenAndServe(":80", nil)) 
} 

Anfrage:

$ curl prefix.api.sandbox.example.com/any -v 
* Trying 127.0.0.1... 
* Connected to prefix.api.sandbox.example.com (127.0.0.1) port 80 (#0) 
> GET /some HTTP/1.1 
> Host: prefix.api.sandbox.example.com 
> User-Agent: curl/7.43.0 
> Accept: */* 
> 
< HTTP/1.1 404 Not Found 
< Content-Type: text/plain; charset=utf-8 
< X-Content-Type-Options: nosniff 
< Date: Wed, 01 Jun 2016 22:08:21 GMT 
< Content-Length: 19 
< 
404 page not found 
* Connection #0 to host prefix.api.sandbox.example.com left intact 

Antwort

2

Die ^ und $ Metazeichen zum Abgleichen Anfang und Ende der Zeilen entfernt werden sollen, können die Pars als gut.

route := router.Host(`prefix.api{_:|\.sandbox}.example.com`)` 

Meine hosts-Datei:

○ grep prefix /etc/hosts 
127.0.0.1 prefix.api.example.com 
127.0.0.1 prefix.api.sandbox.example.com 
127.0.0.1 prefix.api.xsandbox.example.com 

gibt mir die folgende:

○ curl prefix.api.example.com:8000 
hello world%                                                                  
○ curl prefix.api.sandbox.example.com:8000 
hello world%                                                                  
○ curl prefix.api.xsandbox.example.com:8000 
404 page not found 

Aktualisiert:

Hier sind die reguläre Ausdrücke durch die beiden unterschiedlichen .Host() ‚s erzeugt :

route := router.Host(`prefix.api{_:(^$|^\.sandbox$)}.example.com`) 

regexp: ^prefix\.api(?P<v0>(^$|^\.sandbox$))\.example\.com$

route := router.Host(`prefix.api{_:|\.sandbox}.example.com`) 

regexp: ^prefix\.api(?P<v0>|\.sandbox)\.example\.com$

  • Beispiel Tests für beide reguläre Ausdrücke können mit here bei play.golang
+0

Ich denke, gespielt werden, dass, wie es passt mehr Routen als es sollte, oder? https://play.golang.org/p/uvxjxrfDrE –

+0

Wenn das der Fall wäre, sollte 'prefix.api.xsandbox.example.com' 'hallo world' zurückgegeben haben? – chrsblck

+0

@Theuserwithnohat aktualisiert mit den generierten Host-Regexes. – chrsblck