子域作为查询字符串

时间:2018-12-07 02:52:01

标签: c# asp.net

ASP.net C#中有什么方法可以将子域视为查询字符串?

我的意思是,如果用户键入london.example.com,那么我可以读到他在london数据之后,并根据该数据运行查询。 example.com当前没有任何子域。

3 个答案:

答案 0 :(得分:3)

这是一个 DNS问题,而不是C#/ ASP.Net / IIS问题。从理论上讲,您可以使用wildcard DNS record。在实践中,您会通过以下链接遇到此问题:

  

在RFC 1034中指定了何时匹配通配符的确切规则,但是这些规则既不直观也不明确。这会导致实现不兼容,并且在使用时会产生意想不到的结果。

因此您可以尝试一下,但是收效不太好。此外,您可以摆弄各种东西,直到它可以在您的测试环境中正常工作为止,但是那不能保证一切对公众都很好。您可能会选择具有API的优秀DNS提供商,并编写代码以使用API​​保持各个DNS条目保持同步,这会做得更好。您也可以设置自己的公共DNS服务器,尽管我强烈建议使用知名的信誉良好的商业DNS主机。

您可能遇到的另一个问题是TLS / SSL证书(因为当然您将使用HTTPS。对吗? RIGHT!?),您可以尝试一张通配符证书,也许还可以,但是取决于您执行的其他操作,您可能会发现它不够用;突然之间,您需要为数据库中的每个城市条目都提供一个单独的SSL证书,即使通过Let's Encrypt服务,这也可能是真正的痛苦

如果您尝试这样做,则IIS可以轻松地基于通配符主机名将请求映射到ASP.Net应用程序,而ASP.Net本身也可以轻松地从请求中读取和解析主机名,以及基于此返回不同的结果。尽管我不确定是否可以基于此属性在C#/ ASP.Net中进行MVC路由,但是IIS URL重写应该可以帮助解决此问题。

答案 1 :(得分:1)

技术含量较低的解决方案可以是这样的:(参考:https://www.pavey.me/2016/03/aspnet-c-extracting-parts-of-url.html

    public static List<string> SubDomains(this HttpRequest Request)
    {
        // variables
        string[] requestArray = Request.Host().Split(".".ToCharArray());
        var subDomains = new List<string>();

        // make sure this is not an ip address
        if (Request.IsIPAddress())
        {
            return subDomains;
        }

        // make sure we have all the parts necessary
        if (requestArray == null)
        {
            return subDomains;
        }

        // last part is the tld (e.g. .com)
        // second to last part is the domain (e.g. mydomain)
        // the remaining parts are the sub-domain(s)
        if (requestArray.Length > 2)
        {
            for (int i = 0; i <= requestArray.Length - 3; i++)
            {
                subDomains.Add(requestArray[i]);
            }
        }

        // return
        return subDomains;
    }

    // e.g. www
    public static string SubDomain(this HttpRequest Request)
    {
        if (Request.SubDomains().Count > 0)
        {
            // handle cases where multiple sub-domains (e.g. dev.www)
            return Request.SubDomains().Last();
        }
        else
        {
            // handle cases where no sub-domains
            return string.Empty;
        }
    }

    // e.g. azurewebsites.net
    public static string Domain(this HttpRequest Request)
    {
        // variables
        string[] requestArray = Request.Host().Split(".".ToCharArray());

        // make sure this is not an ip address
        if (Request.IsIPAddress())
        {
            return string.Empty;
        }

        // special case for localhost
        if (Request.IsLocalHost())
        {
            return Request.Host().ToLower();
        }

        // make sure we have all the parts necessary
        if (requestArray == null)
        {
            return string.Empty;
        }

        // make sure we have all the parts necessary
        if (requestArray.Length > 1)
        {
            return $"{requestArray[requestArray.Length - 2]}.{requestArray[requestArray.Length - 1]}";
        }

        // return empty string
        return string.Empty;
    }

以下问题与您的相似:

Using the subdomain as a parameter

答案 2 :(得分:1)

我必须添加到先前的答案中,即在修复了dns之后,并将子域转换为某些参数,您可以使用<div id="search-component"> <input #searchBox id="search-box" (input)="search(searchBox.value)" /> <ul class="search-result"> <li *ngFor="let result of searchFindLoop" > <a>{{result}}</a> </li> </ul> 将这些参数移至页面。

例如,假设某个函数RewritePathPathTranslate()转换为london.example.com

然后,您使用example.com/default.aspx?Town=1保留子域,并同时将参数发送到页面。

RewritePath

string sThePathToReWrite = PathTranslate();

if (sThePathToReWrite != null){
    HttpContext.Current.RewritePath(sThePathToReWrite, false);
}