博客文章“为您的域名提供“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.com
,go.ext.google.com
或go.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.com
vpn.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 搜索路径:
- Windows DHCP 说明
去做
- 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)
);
它应该(未经测试)生成一个两项搜索列表。
- dnsmasq DHCP 指令
去做
配置静态配置的机器:
- 视窗
去做
- 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,并提供方便的共享热链接列表,以帮助人们到达他们可能想要去的地方。
欢呼,-丹尼