4

ルートにはGolang Gorilla Toolkitの Mux パッケージを使用しています。

次のルートを検討してください。

m.HandleFunc("/admin/install", installHandler).Methods("GET")
m.HandleFunc("/admin/^((?!install).)*$", adminHandler).Methods("GET")
m.HandleFunc("/admin", adminHandler).Methods("GET")

問題は中間ルートの正規表現にあります - 解釈されないため、ルートは機能しません!

m.HandleFunc("/admin/{^((?!install).)*$}", adminHandler).Methods("GET")

{} 中括弧でも機能しません。無視され、/admin/ として扱われます。

どちらもしません:

m.HandleFunc("/admin/{_dummy:^((?!install).)*$}", adminHandler).Methods("GET")

要するに、ここで達成しようとしているのは、最初に /admin/install ルートと一致させ、正規表現を使用して以下のルートから除外したい正確なルートを一致させることですが、うまくいきません。

gorilla mux パッケージで正規表現を使用する方法はありますか?

4

2 に答える 2

5

実際にこれを行うことは可能です:

m.HandleFunc(`/{_dummy:admin\/([^install]*).*}`, adminHandler).Methods("GET")

編集:

上記の VonC のコメントに対する私の回答として、ここに go アプリのサンプルがあります: https://play.golang.org/p/nYWNADK7Sr

ローカル PC で実行します。次のルートを試してください。

http://localhost:8080/admin/ - (returns "adminHandler")
http://localhost:8080/admin/something - (returns "adminHandler")
http://localhost:8080/admin/install - (returns "installHandler")

はい、VonC、それは特定の問題を解決します:

「最初に /admin/install ルートに一致させ、その正確なルートを以下のルートから除外したい」

しかし、「インストールという言葉が続かない」という意味ではないことは正しいです。これは、re2 構文の範囲内で可能な代替アプローチにすぎません。インストールという単語が URL に表示された場合、単純に「無視」または除外します。

于 2015-03-23T22:24:03.477 に答える
1

golang regexp は先読みまたは後読みをサポートしないre2 構文に従うため、機能しません。

/admin/install firstのハンドラーを定義する必要がある場合があります。
次に、他のすべて/admin/xxxは他のルート用になります(つまり、そうではありません/admin/install

実際、OP SK84はコメントに次のように追加します。

admin/install が最初に定義されていても、/admin/ も実行されます。それは私が避けたかったことです。

その場合、管理ハンドラー内でそれをコーディングする必要があると思います-簡単ですが、機能した場合ほどきれいではありません。

于 2015-03-09T20:00:33.913 に答える