问题

问题

博客文章“为您的域名提供“tinyurl”服务“解释了如何使用 Google Apps 为您的域设置 ShortName 服务。例如,如果您的域是,example.com并且您使用 Google Apps,则可以将其配置为http://go.example.com企业的个人 ShortName 服务。

注意:这并不是要创建一个供全世界使用的“tinyurl”服务。这是为企业提供的。

拥有只有用户才能使用的短名称服务很有用,这样您就可以创建指向内部页面的链接。与其告诉人们一个又长又难懂的 URL,不如说“今天的午餐菜单是http://go.example.com/lunch“。这篇博文记录了授权人们建立自己的链接的一些好处。(最重要的是:他们不必麻烦您建立新的链接!)

问题

该系统的问题是 URL 仍然很长。人们宁愿在 Web 浏览器中输入“go/lunch”并让它工作。遗憾的是,由于 HTTP 协议的工作方式存在技术性问题,Google Apps 无法支持此功能。HTTP 1.1 中的“Host:”标头列出了用户在 Web 浏览器中输入的域,而不是完整限定域名 (FQDN)换句话说,当 Google Apps 收到“http://go/lunch“网络服务器接收“go”作为主机名。由于 Google Apps 为许多域提供此服务,因此它无法判断您是否go.example.com想要go.some-other-example.com

结果,用户每次都必须输入“go.example.com/lunch”,这比“go/lunch”长得多。

解决方案

Google 可以使用网络 cookie 或其他方案来解决这个问题。但这些方案都不是特别干净或容易的。在此之前,您可以通过设置一台自己的机器来解决这个问题,该机器接受请求并将其重定向。

服务器接受名为“go”的站点的 HTTP 请求,并将请求重定向到go.example.com。然后,您创建正确的 DNS 记录以使其正常工作,并调整您的 DHCP 配置,以便您的笔记本电脑/工作站做正确的事情。

此 Server Fault 文档的目的是解释该过程,然后提供配置示例,以帮助您为站点执行此操作。由于我无法访问或了解世界上的每个操作系统,因此我将其设为“社区 wiki”,以便人们可以在他们使其工作时填写配置片段。我在特别需要改进的区域添加了“TODO”。

细节

在此示例中,我们将使用“example.com”作为域名。

步骤 1:以正常方式设置 Google Apps 服务。

正常配置服务go.example.com。测试并确保 URLhttp://go.example.com/foo有效。如果未完成,请不要继续。这就像在拥有汽车之前尝试修理汽车一样。

第 2 步:选择您的重定向器主机名

如果您的短名称服务是go.example.com,理想情况下,您应该将重定向器的名称设为go.example.com。遗憾的是,物理学不允许两个物体同时出现在同一个地方,而 DNS 遵循物理定律。

诀窍是让重定向器与 ShortName 服务具有相同的主机名,但在不同的域中。例如,go.corp.example.comgo.ext.google.comgo.this-is-different.example.com

大型公司通常有一个内部子域,不对外公开。通常内部主机是INSIDEHOST.corp.google.com。这就是您放置重定向器的地方。

有些公司会分配一个子域名,该子域名充满了指向应从公司内部和外部访问的服务的 CNAME。这样,就有一个子域名需要放在人们的 DNS 搜索路径中。(Unix 用户可以将其视为一个充满/usr/local/bin符号链接的子目录)传统上,此子域名是ext.example.com。该子域名中的 CNAME 包括mail.ext.example.com、、等。)calendar.ext.example.comvpn.ext.example.com

警告:向您的 DNS 搜索路径添加另一项是让您的计算机运行速度变慢的另一种方式。每次都执行额外的 DNS 查询会很慢,并且浏览网页的速度会明显变慢。将此重定向器添加到您计算机的 DNS 搜索路径中已有的子域会更好,即使这意味着要在多个子域中添加 CNAME。例如,如果您的内部计算机和连接到 VPN 的计算机已corp.example.com在其搜索路径中,请在那里添加 CNAME。如果您希望未通过 VPN 连接的外部计算机能够访问重定向器,corp.example.com如果那是从未从外部访问过的计算机的子域,则将其硬编码到它们的搜索路径中可能会很奇怪。在这种情况下,可以将另一个 CNAME 添加到外部子域(如ext.example.com)以指向重定向器。更新 Web 服务器配置以支持两者。

对于此示例,我们假设您已选择重定向器为go.ext.example.com。机器可以任意命名,我们将在 DNS 和 Web 服务器配置中完成所有神奇的工作。

步骤 3:规划重定向器

您要设置的 Web 服务器可以是现有的 Web 服务器,也可以是专门为此目的而构建的新服务器。关键是,该机器必须可以从您希望 ShortName 服务工作的任何地方访问:公司内部、公司外部、用户通过 VPN 连接时。(出于安全原因,您可以选择放弃在公司外部工作。出于安全原因,您也可以在公司内部设置一台机器,在公司外部设置另一台机器。)

注意:您不必为此设置新的 Web 服务器。只要配置不存在,您就可以将其添加到预先存在的 Web 服务器中。

注意:这可能相当复杂。您可能希望专注于在最简单的情况下使其工作,然后在工作和测试后,使其在其他情况下工作。特别是,按以下顺序使其工作:1. 公司内部的工作站/笔记本电脑 2. 然后通过 VPN 连接的机器,然后是公司外的机器(例如,在网吧)。3. 然后是网络外的机器,没有 VPN 4. 然后在其他操作系统上测试它

在此示例中,我们假设有一个 Web 服务器,无论您是在公司内部还是外部,都可以通过相同的 IP 地址访问。

在我们的“前进。公司.example.com” 示例,这意味着“go”位于仅供内部人员访问的子域中,并且需要 VPN 才能使用 ShortName 服务。由于 Google Apps 通常配置为无需 VPN 即可工作(因为所有访问都是 HTTPS),因此这不是最优的。

在我们的“前进。扩展.example.com”示例,这意味着子域名可从公司内部和外部访问,并且记录A指向外部 IP 地址。

步骤 4:为重定向器添加 DNS 记录

以下是所需的 DNS 记录:

go.example.com.                IN CNAME ghs.google.com.
go.ext.example.com.            IN A 64.32.179.5
go-redirector.example.com  IN A 64.32.179.5

第一个 DNS 记录 (go.example.com) 应该已经作为步骤 1 的一部分存在。

第二个 DNS 记录(go.扩展.example.com) 是A指向您正在配置的新 Web 服务器的 IP 地址的记录。

第三个 DNS 记录(go-redirector)是为了帮助您进行调试。

步骤 5:配置 Web 服务器

将重定向添加到 Web 服务器。(假设 Web 服务器已安装并正在运行)。

以下是 Apache 配置片段:

<VirtualHost *:80>
        ServerName go-redirector.example.com
        ServerAlias go, go.ext, go.ext.example
        RewriteEngine on
        RewriteRule ^(.*)$ http://go.example.com$1 [R=permanent]
</VirtualHost>

如何测试这一点。 http://go-redirector.example.com应该可以在这一点上工作。

在本测试成功之前不要继续。循序渐进。

步骤 6:配置客户端的 DNS 搜索路径

现在我们要配置机器(任何运行 Web 浏览器的设备),以便 DNS 搜索路径包含“ext.example.com”

在您的 DHCP 服务器和 VPN 服务器上发送一个 DNS 搜索路径:

corp.example.com 。

(带有重定向主机的子域名,后跟“。”)

或者,您可以使用如下搜索路径:

corp.example.com 例如.com 。

然而,这会为我们访问的每个网页添加额外的 DNS 查找。由于 99% 的时间它们都会失败,这只会使网络浏览速度变慢。

在工作站和笔记本电脑上,您需要确保子域名包含在其 DNS 搜索路径中。这样,当用户输入“go”时,软件就会在域中找到它。

我们希望配置机器的搜索路径,以包括该子域的所有可能设置搜索路径的方式:

最初,DNS 搜索路径无法通过 DHCP 设置。这是一项新增功能,并非所有 DHCP 客户端都支持此功能。即使是支持此功能的 DHCP 客户端也需要进行修改,因为当笔记本电脑在(例如)网吧时,它会与您无法控制的 DHCP 服务器通信。当笔记本电脑使用 VPN 时,VPN 客户端软件实际上并不使用 DHCP,但 VPN 服务器通常会以某种方式传输通常从 DHCP 服务器获取的设置。

因此,您需要在所有这些位置设置 DNS 搜索路径:

  • DHCP 服务器应发送 DNS 搜索路径选项
  • 静态配置的计算机应设置其 DNS 搜索路径
  • corp.example.com如果 DHCP 服务器尚未包含该域,则应配置使用 DHCP 的客户端以将该域添加到其搜索路径的前面。

以下是有关如何在各种 DHCP 服务器和操作系统上执行此操作的说明。

配置 DHCP 服务器以包含 DNS 搜索路径:

  1. Windows DHCP 说明

去做

  1. ISC DHCP 说明

如果搜索路径只是机器应该所在的域,那么:

option domain-name "corp.example.com";

如果客户端支持 RFC 3397 来提供搜索路径,那么您可以这样做,但这很尴尬,因为没有原生支持 DNS 主机序列的数据类型,每个主机都像 DNS 中一样编码为长度前缀的标签。无法将定义为记录数组的选项的值写入,其中记录包含另一个记录的数组,因此您只能使用数据字符串手动编码。

option dns-search-domains code 119 = string;
option dns-search-domains concat(
    encode-int(4,1), "corp", encode-int(7,1), "example", encode-int(3,1), "com", encode-int(0,1),
    encode-int(7,1), "example", encode-int(3,1), "com", encode-int(0,1)
    );

它应该(未经测试)生成一个两项搜索列表。

  1. dnsmasq DHCP 指令

去做

配置静态配置的机器:

  1. 视窗

去做

  1. Linux/Unix

编辑/etc/resolv.conf并确保(1)“domain corp.example.com”是第一行,(2)添加/编辑“搜索”行以包含域corp.example.com,(3)添加“options ndotes:2”行以减少 DNS 服务器上的负载。

domain corp.example.com
search corp.example.com exmaple.com
options ndots:2

配置 DHCP 客户端以使其在其他 DHCP 服务器上工作

Windows、Linux 等的 TODO 填写。

第 7 步:测试,测试,测试!

现在用户应该能够指定:

http://go/foo http://go.example/foo http://go.example.com/foo

事实上,作为一项信心测试,您需要在所有情况下测试这些 URL:

( each OS you support ) * ( internal LAN / at an Internet cafe / while on the VPN )

第 8 步:其他建议

最后,还有一条建议:即使您在这方面做得非常完美,http://go/foo当有人在您未配置为强制 DNS 搜索路径包含您的域的计算机上尝试输入链接时,您仍然面临链接无法正常工作的风险。因此,您应该使用完整的 URL 发布链接:http://go.example.com/foo;并花时间教育您公司的公关部门和其他人始终以这种方式指定它。

或者至少用 HTML 对其进行编码,以便“go”在链接文本中可见,但实际的 HREF 转到 FQDN:

<a href="http://go.example.com/lunch">go/lunch</a>

教公关部门的人这样做可能很难。你可能只想告诉他们,go.example.com无论写什么,他们都必须使用长版本 ( ),因为短版本“go/lunch”只有在偶然情况下才有效。

步骤8:HTTPS

TODO:研究如何使用 HTTPS(要获得正确认证将会非常困难,甚至不可能)。

答案1

这个问题应该以某种方式标记为“已回答”。这样,https://serverfault.com/unansweredURL 将保持正确。请(发布并)接受此问题的“答案”。谢谢!

我的“答案”是,构建(或安装)链接缩短服务非常简单,无需经历上述所有麻烦,只需在 Web 服务器上设置本地链接缩短服务,该服务可响应“go.example.com”,并确保您的 DNS 响应搜索 example.com。这样,您就不会将内部 URL 泄露给全世界。(可能我没有抓住重点。)

备择方案:

  • 对于非常小的公司或工作组,请询问每个人他们最喜欢的书签,并在内部网首页上找一些空间放在上面。

  • 或者,将您的小公司或团体的 Intranet 部署为 wiki,并提供方便的共享热链接列表,以帮助人们到达他们可能想要去的地方。

欢呼,-丹尼

相关内容