【问题标题】:How to refer to main domain without hard-coding its name?如何在不对其名称进行硬编码的情况下引用主域?
【发布时间】:2012-04-15 06:16:27
【问题描述】:

我有一个域名:TestSite.com。我为此站点创建了几个子域,并将它们称为 first.TestSite.com、second.TestSite.com 等。

我如何相对地引用 TestSite.com 而无需在 first.TestSite.com 的 html 或 aspx 文件中硬编码其名称?我的意思是(以文件夹为例)如果我首先有一个文件夹 TestSite 和一个子文件夹

TestSite/第一

,然后从一开始我可以通过

引用它的父 TestSite 文件夹

../

从 first.TestSite.com 引用 TestSite.com 时我使用什么?谢谢。

【问题讨论】:

  • 文件夹是嵌套的层次结构。子域不是。子域可能会给 javascript 和 cookie 以及 ssl 证书带来问题。它甚至会为图像缓存等问题引入问题——first.testsite.com 中的blank.gif 与testsite.com 中的blank.gif 是否相同?对于浏览器来说,它不是。
  • 子域也可能导致搜索引擎蜘蛛和排名问题,如果这对您的情况很重要。
  • @BrianWhite 是正确的 SSL。此外,SSL 仅适用于一个 IP 地址(使用 Apache)。因此,即使您有钱为每个子域购买 SSL 证书,他们也需要拥有自己的 IP。根据您的 ISP 限制,这可能是不可能的。

标签: asp.net html


【解决方案1】:

没有办法使用纯粹的相对链接。您必须将其编程为字符串操作。

类似:

var host = location.host;
var lastPeriod = host.lastIndexOf(".");
var remainder = host.substring(0, lastPeriod);
var afterSecondLastPeriod = remainder.lastIndexOf('.') + 1
var baseDomain = host.substring(afterSecondLastPeriod);
console.log(baseDomain);

编辑:使用正则表达式的较短版本:

var baseDomain = host.match(/[^.]*\.[^.]*$/)[0]

这是通用的,所以它总是返回最后一部分。不管是a.TestSite.comb.a.TestSite.com等,都会返回TestSite.com

如果这个假设不正确,你将不得不修改它。

【讨论】:

    【解决方案2】:

    如果你想保留你的相对链接,你可以使用base元素。

    [基本元素的 href] 属性指定一个绝对 URI,作为基本元素 用于解析相对 URI 的 URI。

    所以,添加一个base 元素,指定您想要的href,页面上的所有相对URI 现在都使用您指定为base URI 的URI。

    <head>
        <base href="http://testsite.com" />
    </head>
    

    这就是你所需要的。但是,如果您想让事情变得更简洁,您可以使用 System.Configuration.@987654322@.@987654323@ 从 web.config 中提取该 URI。这是一个aspx sn-p:

    <head>
        <base href="<%= ConfigurationManager.AppSettings["rootdomain"] %>" />
    </head>
    

    还有 web.config:

    <configuration>
      <appSettings>
        <add name="rootdomain" value="http://testsite.com" /> 
      </appSettings>
    </configuration>
    

    此方法允许您从 one 影响许多元素,其值可以从 web.config 驱动。

    【讨论】:

      【解决方案3】:

      由于您将问题标记为 ASP.NET,因此我假设您希望在服务器端执行此操作,因此您无需依赖客户端的 JavaScript 来生成 HTML 链接。

      首先,确保您的子域站点中有一个 web.config 文件,并将其添加到配置中:

      <configuration>
        <appSettings>
          <add name="MainDomain" value="example.com" /> 
        </appSettings>
      </configuration>
      

      在您的 ASPX 页面中使用此设置,您的子域页面之一上的超链接将如下所示:

      <a href="<%$ AppSettings: MainDomain %>">Go to main domain home page</a>
      <a href="<%$ AppSettings: MainDomain %>/products.aspx">Go to products page on the main domain</a>
      

      name="MainDomain" 的设置将从配置文件中读取,并插入到显示&lt;%$ AppSettings: MainDomain %&gt; 的页面中。这样,您就可以在服务器端创建所需的 HTML,而无需硬编码。

      如果需要更改名称,只需更新配置文件,所有页面都会自动使用新域名。

      【讨论】:

        【解决方案4】:

        另一种解决方案是为实时服务器使用原始域名,但将其指向您的开发环境。

        您可以通过在此文件中添加行来覆盖 Windows 中的 DNS 查找。

        C:\Windows\System32\drivers\etc\hosts

        使用文本编辑器添加以下内容。

        127.0.0.1   www.livesite.com
        127.0.0.1   first.livesite.com
        127.0.0.1   second.livesite.com
        

        这些域现在将映射到本地主机。因此,无需破解 HTML 进行测试。

        【讨论】:

        • 警告,将多个域指向 127.0.0.1 总是会给我带来奇怪的问题。它从来没有成为我所面临的复杂问题的简单解决方案。我在许多不同的情况下都尝试过,但总是最终恢复它。
        • @Brian:AFAIK 将多个主机名指向 127.0.0.1 并没有错,就像将多个主机名指向任何其他 IP 地址一样。但是,这确实意味着您需要将开发网络服务器配置为基于名称的虚拟主机(除非您希望所有开发站点看起来都相同)。
        • @BrianWhite 大多数 Web 开发人员使用主机将多个域指向他们的本地主机。否则不可能在一个以上的网站上工作。因为只有一个站点可以配置为在本地主机之外运行。我所做的是将我所有网站的 .com 更改为 .local。例子; www.thinkingmedia.ca 在我的开发机器上变成 www.thinkingmedia.local。我目前有 50 多个本地站点正在运行,没有任何问题。抱歉,您遇到了麻烦,但是如果您提出有关这些问题的新问题。我很乐意提供帮助。
        • 在上述设置中,您会发现您在开发中的 prod 中遇到的任何跨站点、缓存或 ssl 证书问题吗? @Matthew,我说的不是实际上不同的站点,而是同一个站点的不同部分,只是名称不同
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 2023-04-03
        • 2011-11-10
        • 2010-10-16
        • 1970-01-01
        • 2018-08-18
        • 2020-01-08
        相关资源
        最近更新 更多