网站应如何处理带有结尾点的主机名?


16

我读过这个问题,URL如何有一个点。最后,例如www.bla.de。并意识到FQDN应该包含.DNS树的根标签的结尾:

example.com. 代替 example.com

但是,此博客文章中指出了一些问题:

如果您不认为用户可能会不小心输入域名结尾的域名,或者跟随从“好心人”那里收到的链接进入域名,并以结尾结尾的域名作为域名,结果可能导致意外后果:

1)如果网站使用HTTPS,则在导航到域名后带有点的末尾时,浏览器将在不可信连接上显示警告。

2)身份验证可能会被破坏,因为通常会为域名设置cookie,在末尾不带点。在这种情况下,用户为什么不登录将感到非常惊讶。值得注意的是,如果您为域名后面设置了一个小圆点,则该cookie将不会传递给没有小圆点的域名最后,反之亦然。

3)页面上的JavaScript可能损坏。

4)网站页面的缓存可能存在问题(例如,https://www.cloudflare.com/如果域名末尾带有点号,则认为该域名无效),则不清除页面缓存)。

5)如果在Web服务器配置的情况下,您依赖于特定域名(Nginx中为$ http_host,Apache中为%{HTTP_HOST}),但结尾没有点号,则可能会遇到各种意外情况:意外的重定向,基本-授权问题等

6)如果未将Web服务器配置为接受带有结尾点的域名请求,则任何不小心键入带有结尾点的域名的用户都将看到类似“错误的请求-无效的主机名”的信息。

7)如果有人无意或故意在域名末尾发布了指向您网页的链接,则搜索引擎可能会发现您的资源具有重复的内容。

我也意识到这样http://webmasters.stackexchange.com./400 Bad Request。但是由于正确的域名应该.在末尾包含a ,我们不应该发布400错误或301重定向主机名而不带尾随点吗?以连贯一致的方式处理此问题的正确方法是什么?


这个点有一个严重的误解,但是我写答案已经太久了,我可能会说错话。可以说圆点代表域名的根或父级。这里的根是“网站管理员”,根是“点”,因此“点”将不在URI的末尾,在这种情况下,我认为它根本不属于URI。就像我说的,我已经忘记了太多的确切操作,我将其留给其他人。
罗布

我只想留下笔记;使您的域名与兼容。-就我个人而言,我总是在最后加一个点,我不知道为什么,而且我注意到很多(很多)网站与此都不兼容。
威廉·爱德华兹

的。域名末尾的[点]始终是透明的,并不打算由用户使用。它是TLD的根(TLD是域).com。对于我的朋友威廉姆斯,我个人不会担心在URL末尾加点的奇怪的蝶形螺母,这确实令人印象深刻。;-)
closetnoc 2014年

@closetnoc好吧,我应该承认;)这只是一个怪异的习惯。您不应该因为用户的行为而优化您的网站使其兼容,而是因为技术方面的原因。
William Edwards 2014年

@ WilliamD.Edwards至少它不像用脚趾to牙一样奇怪...不是我这样做了...不再。
closetnoc

Answers:


3

要部分回答您的问题,可以将其添加到htaccess规范转发器规则中。从基本的HTTP角度讲,它会在URI之前查找一个时间段,并将其应用于您使用的任何反复制转发机制。这是一个包含公用“附加域”子实用程序路由的示例:

RewriteCond %{HTTP_HOST} ^domain\.hostdomain\.com(|\.)$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain\.hostdomain\.com(|\.)$ [OR]
RewriteCond %{HTTP_HOST} ^domain\.com(|\.)$ [OR]
RewriteCond %{HTTP_HOST} ^www.domain\.com\.$
RewriteRule ^(.*)$ "http\:\/\/www\.domain\.com\/$1" [R=301,L]

这将把以下所有内容转发到规范的HTTP www域:

  • domain.hostdomain.com
  • domain.hostdomain.com。
  • www.domain.hostdomain.com
  • www.domain.hostdomain.com。
  • domain.com
  • domain.com。
  • www.domain.com。

全部转发至:

不过,需要注意的是 -如原始博客报价所述,SSL将无法正确转发,并且在大多数服务器实例(尤其是HSTS)中会发出浏览器警告或400错误的请求错误。这是因为它在TLD后的用例中看到了“主机” SSL。我不确定要处理主机SSL警告的变通办法,因为它在htaccess和其他东西之前出现。


撇开:而不是从每个可能的域重定向到规范example.com。可能更容易地说:如果没有,example.com则重定向到example.com。(?)
怀特先生

1

我喜欢将尾随点视为互联网的“真正”根源,它生活在美国弗吉尼亚州。如果省略点,则总是隐含一些根。对于普通用户,这是相同的根源,这就是我今天要讨论的情况。

以我不正当的方式,我实际上发现尾随点非常方便。如果我要检查别人的网站,并且想重新开始,没有缓存,没有cookie等,而且我懒得将其冲洗掉,则可以使用其他浏览器,也可以添加点。如果该站点未重定向我,那么我将获得所有站点页面和其他资源的全部未缓存URL。

作为网站管理员,我希望所有查看页面的人和机器人都使用相同的URL并因此使用相同的主机名来查看该页面。如果主机名不是我希望他们使用的主机名,我将立即进行301重定向,以便他们在浏览器中看到正确的URL。对于我的基于PHP的站点,我使用PHP而不是.htaccess或web.config文件来处理问题,因为它具有更高的可移植性,并且更易于在开发和登台服务器上进行测试。我同时处理数据库连接,因为它们在开发/登台/生产服务器之间也有所不同。

这是我的典型代码的简化版本。请注意规范重定向到最后。

    $Host = $_SERVER['HTTP_HOST'];
    switch ( $Host ) {
        case 'exampleweb.local':                    // my local dev machine
                $MysqliParams = array(
                        'host'      =>  'localhost',
                        'username'  =>  'root',
                        'passwd'    =>  'snoopy',
                        'dbname'    =>  'exampledb');
                break;
        case 'www.exampleweb.com':                  // the "live" site
                $MysqliParams = array(
                        'host'      =>  'superhost1.net',
                        'username'  =>  'examp302',
                        'passwd'    =>  'anything-but-snoopy',
                        'dbname'    =>  'examp302_db');
                $GoogleAccount = 'UA-13243546-01;   // only enable for live site
                break;
        case 'exampleweb.mystagingsite.net':        // the client preview site
                $MysqliParams = array(
                        'host'      =>  'superhost1.net',
                        'username'  =>  'examp302',
                        'passwd'    =>  'anything-but-snoopy',
                        'dbname'    =>  'examp302_staging');
                break;
        case 'exampleweb.com':                  // canonical redirects 
        case 'exampleweb.com.':
        case 'www.exampleweb.com.':
                header('HTTP/1.1 301 Moved Permanently');
                header("Location: http://www.exampleweb.com");
                exit;
        default:
                die("invalid hostname $Host");
    }   

通常,我是通过Apache虚拟主机完成主机规范化的,而不是通过代码进行处理。看来Apache将HTTP主机名与带或不带尾点的虚拟主机匹配,但是您可以看到代码中是否有带尾点的主机。
斯蒂芬·奥斯特米勒

1

我的评论位于https://core.trac.wordpress.org/ticket/35248#comment:9

我对第一个链接的回复( https://web.archive.org/web/20160604095348/http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/web-fully-qualified-domain-name.html):

最初,按照RFC 1738(§3.1)的定义,(通用Internet方案)URL的“主机”部分始终是毫无疑问的完全限定域名,并且是区分完全限定域名和非完全限定域名的常规机制。限定域名不适用。无论是example.com。或example.com,则主机应该是相同的。

-我认为他是不对的,根据rfc 1738,我认为url中根本不允许使用“ example.com”,在第二个文本中引用了该词,并引用:

3.1。通用Internet方案语法
        // <用户>:<密码> @ <主机>:<端口> / <URL路径>
    主办
        网络主机的标准域名

和“ example.com”当时不能在http标头中使用,因为rfc 1738是1994年,并且host字段仅在1997年出现在http 1.1中(可以在Wikipedia中查看)。

因此,实际上,只有fqdn保留在网址中。我认为,这是rfc 1738中的错误,因为以这种方式,它(试图使)“相对域”功能无效。如果不禁止,则理论上可以在本地脚本站点的“ a”标签hrefs中使用它们,或者如果浏览器和服务器支持,则可以在使用相对域的大公司内部的静态html文档中使用它们。但是即使rfc 1738禁止使用它们,人们也没有听从:他们继续以相对形式使用顶级域名,即没有尾随点,因此rfc 1738不允许这样做并不是一个大的实际问题,人们不得不使用替代方法相对域名:他们只是将本地顶级域名设为“本地主机”(并且使用和使用它们也没有尾随点)。

然后他说:

不幸的是,实际上,在将主机名映射到一组IP地址时,Web浏览器始终违反该规范,并通过其DNS客户端库的名称限定过程传递了“主机”部分。(例如,使用BIND DNS客户端库的用户将保留RES_DNSRCH选项,并且如果缺少最后的结尾点,则不会附加该结尾点。)

-我认为他是说没有尾随点的主机应该作为错误抛出,而只有绝对域(fqdn)应该传递给dns。我认为可能浏览器确实将所有域都传递给了dns,因为人们使用了他们自定义的本地顶级域,例如“ localhost”。并且无论如何,后来在1998年发布的rfc 2396中,允许在网址中使用顶级域名而不使用尾随点。

然后,作者(Jonathan de Boyne Pollard)引用了rfc 2396,并对它根据既定的人类行为(即事实上的标准)而改变感到遗憾,他说最好是浏览器遵守rfc 1738,并建议所有人只使用fqdn,所有地方,如RFC 1738所指示。

-但是,如果人们遵守RFC 1738会发生什么?像“http://example.com/test.html “和”http://localhost/test.html “必须全部重写为”http://example.com./test.html “和”http://localhost./test.html“。浏览器必须将没有点的主机标记为错误,或者将其重定向为完整/绝对形式。所有配置本地顶级域(如“ localhost”)的人都必须将其服务器配置为仅接受请求(例如“ localhost。”之类的域),或者接受“ [localhost]中的所有URL”并将其重定向到“ [localhost。]中的相应URL”。“ localhost”之类的文本仅在浏览器地址栏中输入时才有用,但是只会是非常无用的用法,并且不需要相对域功能,因为浏览器会在键入时搜索域,因此在html源中使用它们将变得无用,因为这将导致此类链接无法正常工作或单击全部与“本地主机”的链接会将用户移至“本地主机”。”,那么每次点击(在此类链接上)都将获得额外的重定向。因此,rfc 1738会使计划中的“相对域”功能完全无用。如果某些公司使用了该功能,并在其本地站点中使用了其相对域,并且其具有相对域的URL不会被浏览器重定向到绝对形式,因此它们的站点可以正常工作,如果他们也遵循rfc 1736,他们会将其服务器配置为仅接受fqdn,则必须使用以下命令重写所有此类URL fqdn,或对此类URL的每次单击进行额外的重定向。如果该公司喜欢在其地址栏和html来源中使用“ team101”而不是“ team101.microsoft.com”之类的短域名,则他们必须开始使用他们自定义的内部顶级域名,例如“ team101”,即“本地主机”,而不是“ team101.microsoft.com”之类的子域(在他们决定遵循rfc 1738之前可以用作“ team101”)。

-

而且我发现,RFC 1738大力支持的尾随点实际上仅在不带尾随点的标准之后出现!它在1987年与rfc 1034一起出现,在第二个链接中被引用,我引用它:

由于完整的域名以根标签结尾,因此导致
以点结尾的印刷表格。我们使用此属性来区分:
-代表完整域名的字符串
 (通常称为“绝对”)。例如,“ poneria.ISI.EDU”。
-代表a开头标签的字符串
 域名不完整,应填写
 使用本地域知识的本地软件(通常是
 称为“相对”)。例如,在
 ISI.EDU域。

RFC 1034(1987年)刚刚声明了所有使用过的域,似乎它们都没有尾随点,将它们都声明为相对域!但他们仍然像以前一样工作,因此可能很少有人对此有所了解,并继续认为当他们使用“ example.com”时不加任何结尾时,他们无疑会要求一个唯一的真实“ example.com”网站。因此,在某些情况下,这又成为另一种安全漏洞:子域管理员可能会欺骗著名的真实example.com,即使他没有获得创建任何本地域(如“ localhost”)的权限。因此,rfc 1034的设计也不是很好:似乎其作者并不希望它会{不广为人知,因此造成安全漏洞}!

可能是rfc 1738(1994)最终尝试将绝对域和相对域之间的区分的概念带给广大读者,并在6年后修复了安全漏洞,{但是通过禁止URL中的相对域来修复安全漏洞,使得相对域无用,{但我认为它们可能没有被广泛使用,可能仅在某些大公司中使用}}。因此,如果遵守,那么RFC 1737的结果将是什么[左]?-1)1987年声明的相对域最终将变得无用,因此,用于显示绝对域的尾随点也将最终变为无用和多余的“合法”,即由rfcs定义!(但也许他们计划了多年以后,当广大受众(公众)开始了解相对域的可能性时,才在URL中重新允许相对域)。2)和rfc 1737,如果遵守,还将修复安全漏洞。-但是,即使rfc 1034大规模传播,也不会造成安全漏洞,并且众所周知,使用相对域并不安全!-因此,解决该问题的主要方法是吸引广泛的受众,而发布更多的rfc只是许多方法之一。

我现在认为,相对域功能可能在RFC 1034(1987年)之后就尚未广为人知,因为它的使用范围太有限:仅在某些大公司或提供商的本地网络中,并且该功能没有实际价值,因为本地网络已经可以建立任何本地域,所以该功能仅适用于它自己,实际上这是rfc中无用的文本,任何人都应该知道和使用,而没有任何额外的好处!但是当浏览器开始服从它时,人们通过广泛忽略rfc创造了很少的安全漏洞。

我昨天检查了相对域名功能,它可以工作。(这是可以的,因为RFC 2396(1998年)在RFC 1034(1987年)被拒绝之后又允许了,后来RFC 3986(2005年)仍允许使用)。我在Windows 10中添加了dns后缀-控制面板-...-网络设备属性-ipv4属性-其他-dns选项卡。当我添加“ google.com”然后打开“在firefox中,“ http:// mail / ”会打开google的服务器,但未将其配置为仅在http“主机”标头中使用“邮件”,因此我得到了类似“ 404”的页面。

-

我对第二个链接的回复( http://www.dns-sd.org/trailingdotsindomainnames.html):

他还引用了rfc 1738中的规则,并说:

不幸的是,实现Web浏览器客户端的人们似乎不明白这意味着什么。当您访问网站时,在应用DNS用户的搜索列表来构造DNS服务器中的标准名称后,大多数网络浏览器在“主机:”字段中输入的值是用户键入的内容,而不是计算机最终实际使用的内容。部分名称。例如,用户可以使用以下三种不同的方式来引用主机“ www.example.com”。...在将“ Host:”参数发送到Web服务器时,Web浏览器客户端将输入用户键入的内容(“ www.example.com。”,“ www.example.com”或“ www”)。客户端最终在DNS中查找的内容(在所有三种情况下均为“ www.example.com。”)。...

-这不是很正确(正确),因为rfc 1738在这方面非常严格,即使在浏览器的地址栏中,它也不允许所有url中的相对域,并且url本身是[推荐]的制作方式任何对站点的引用,即使人们将其写在纸上也是如此,因此rfc 1738不允许用户以3种方式引用该站点,前提是该用户认为他们使用了URL!

并且似乎本文的作者(Stuart Cheshire)不了解rfc 2396,因此此文本已过时。

-

如今情况如何?RFC 3986(https://tools.ietf.org/html/rfc3986#page-21)允许引用绝对域而没有结尾点:它表示“ DNS中完全限定域名的最右边域标签后可以跟一个”。 ”,如果“必须区分完整的域名和某些本地域名”,则应使用它。我认为由于事实上的标准,几乎没有必要,因此wordpress可以接受事实上的标准,并从带有尾随点的地址重定向到没有它的地址。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.