5

新しい SaaS サービスに ASP.NET を使用することを検討していますが、ほとんどの SaaS アプリケーション (37Signals など) のように、サブドメインに基づいてアカウントを検索する方法がわかりません。

たとえば、yourname.mysite.com を提供する場合、ASP.NET (具体的には MVC) を使用してサブドメインを抽出し、適切なテンプレート (会社名などを表示) をロードするにはどうすればよいでしょうか? 通常のルーティングで実行できますか?

これは SaaS では一般的であるように思われるため、ASP.NET で簡単に実行できる方法が必要です。Ruby on Rails のような他のフレームワーク用のプラグインがあることは知っています。

4

4 に答える 4

3

これは私のために働く:

    //--------------------------------------------------------------------------------------------------------------------------
    public string GetSubDomain()
    {
        string SubDomain = "";

        if (Request.Url.HostNameType == UriHostNameType.Dns)
            SubDomain = Regex.Replace(Request.Url.Host, "((.*)(\\..*){2})|(.*)", "$2");
        if (SubDomain.Length == 0)
            SubDomain = "www";
        return SubDomain;
    }

IIS のツールを使用して個別のサイトを構築するのではなく、同じ Web アプリケーション内で複数のアカウントを処理したいと考えていると思います。私たちの仕事では、サブドメインごとに新しい Web サイトを作成することから始めましたが、このアプローチはうまく拡張できないことがわかりました。特に、更新をリリースしてから数十のサイトを変更する必要がある場合です。したがって、あなたが提案したことを正確に実行してきた数年間の経験に基づいて、上記で提案したサーバー指向の手法ではなく、このアプローチをお勧めします。

上記のコードは、これが (たとえば、IP アドレスではなく) 完全な形式の URL であることを確認し、サブドメインを返します。かなり大量の環境でうまく機能しています。

于 2008-12-15T14:22:05.313 に答える
2

これはServerVariablesコレクションから取得できるはずですが、最初に IIS と DNS を正しく機能するように構成する必要があります。したがって、37Signals はおそらく Apache または別のオープン ソースの UNIX Web サーバーを使用していることがわかります。Apache では、これはVirtualHostingと呼ばれます。

IIS でこれを行うには、IIS 内のアプリケーション (application.mysite.com) を指すドメインごとに、新しい DNS エントリを作成する (CNAME yourname.mysite.com から application.mysite.com を作成する) 必要があります。

次に、ヘッダー yourname.mysite.com を受け入れるIIS アプリケーション (application.mysite.com) でホスト ヘッダー エントリを作成します。ユーザーは実際には application.mysite,com にアクセスしますが、アドレスはカスタム サブドメインです。次に、ServerVariables コレクションにアクセスして値を取得し、サイトのカスタマイズ方法を決定します。

注: 要件に応じて、従うことができるいくつかの代替実装があります。

  • ハードウェア ロード バランサーでホスト ヘッダー処理を処理し (Web サーバーに依存するよりも、37Signals がこれを行う可能性が高い)、Web アプリケーションに渡すカスタム HTTP ヘッダーを作成します。
  • 個々のアプリケーションごとに新しい Web アプリケーションとホスト ヘッダーを作成します。これはおそらく多数のユーザーにとって非効率的な実装ですが、一部の人々にとってはより優れた分離とセキュリティを提供できます。
于 2008-12-09T17:22:54.607 に答える
1

ワイルドカード サブドメインをサポートするように DNS を構成する必要があります。次のように、IP アドレスを指す A レコードを追加することで実行できます。

* A 1.2.3.4

完了すると、ドメインの前に入力したものはすべてルート ドメインに送信されます。ルート ドメインでは、上記のユーザー バグのように、HTTP_HOST サーバー変数を分割することで取得できます。

 string user = HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".")

//use the user variable to query the database for specific data

PS。共有ホスティングを使用している場合は、ワイルドカード ドメインが機能するために必須であるため、それらの固有の IP アドオンを使用する必要があるでしょう。専用ホスティングを使用している場合は、すでに独自の IP を持っています。

于 2009-01-05T22:36:56.520 に答える
0

私が行った方法は、HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".") を使用することです。

さらにサポートが必要な場合はお知らせください。

于 2008-12-15T14:19:16.443 に答える