2016-06-01 11 views
2

gorilla muxルータを使用して2つのサブドメイン(prefix.api.example.comとprefix.api.sandbox.example.com)に一致するルートを構築する必要があります。これまでのところ私は以下の正規表現を持っていますが、ルータはリクエスト時に404を返します。それはどういう考えですか?サブドメインをゴリラmuxと照合する方法

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

詳細コード

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)) 
} 

要求:

$ 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 

答えて

2

開始や線の端部を一致させるための^$メタキャラクタを除去しなければならない、括弧も同様であることができます。

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

私のhostsファイル:更新

○ 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 

○ 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 

は、次の私に与えます。ここ

は、二つの異なる.Host()年代によって生成された正規表現です:

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

正規表現:^prefix\.api(?P<v0>(^$|^\.sandbox$))\.example\.com$

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

正規表現:両方の正規表現のための^prefix\.api(?P<v0>|\.sandbox)\.example\.com$

  • 例のテストはplay.golang
+0

hereで再生することができ、私はそのようにそれだと思いますそれよりも多くのルートにマッチしますね。 https://play.golang.org/p/uvxjxrfDrE –

+0

その場合、 'prefix.api.xsandbox.example.com'は' hello world'を返してはいけませんか? – chrsblck

+0

@生成されたホスト正規表現でユーザが更新されました。 – chrsblck

関連する問題