ASP.net C#中有什么方法可以将子域视为查询字符串?
我的意思是,如果用户键入london.example.com
,那么我可以读到他在london
数据之后,并根据该数据运行查询。 example.com
当前没有任何子域。
答案 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;
}
以下问题与您的相似:
答案 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>
将这些参数移至页面。
例如,假设某个函数RewritePath
将PathTranslate()
转换为london.example.com
然后,您使用example.com/default.aspx?Town=1
保留子域,并同时将参数发送到页面。
RewritePath
string sThePathToReWrite = PathTranslate();
if (sThePathToReWrite != null){
HttpContext.Current.RewritePath(sThePathToReWrite, false);
}