Dar*_*ein 455 html https uri http protocol-relative
我有以下元素:
<script type="text/javascript" src="https://cdn.example.com/js_file.js"></script>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该站点是HTTPS,但该站点也可能只是HTTP.(JS文件在另一个域上.)我想知道为方便起见,执行以下操作是否有效:
<script type="text/javascript" src="//cdn.example.com/js_file.js"></script>
Run Code Online (Sandbox Code Playgroud)
我想知道是否有效删除http:
或https:
?
它似乎适用于我测试过的所有地方,但是有什么情况下它不起作用吗?
Jef*_*eff 385
根据RFC 3986:"统一资源标识符(URI):通用语法",第4.2节,没有方案(http:或https :)的相对URL有效.如果客户端阻塞它,那么它就是客户端的错误,因为它们不符合RFC中指定的URI语法.
您的示例有效且应该有效.我自己在交通繁忙的网站上使用过这种相对网址方法而没有投诉.此外,我们在Firefox,Safari,IE6,IE7和Opera中测试我们的网站.这些浏览器都了解URL格式.
And*_*ore 150
它保证可以在任何主流浏览器中工作(我不会考虑市场份额低于0.05%的浏览器).哎呀,它适用于Internet Explorer 3.0.
RFC 3986将URI定义为由以下部分组成:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
Run Code Online (Sandbox Code Playgroud)
定义相对URI时(第5.2节),您可以省略任何这些部分,始终从左侧开始.在伪代码中,它看起来像这样:
result = ""
if defined(scheme) then
append scheme to result;
append ":" to result;
endif;
if defined(authority) then
append "//" to result;
append authority to result;
endif;
append path to result;
if defined(query) then
append "?" to result;
append query to result;
endif;
if defined(fragment) then
append "#" to result;
append fragment to result;
endif;
return result;
Run Code Online (Sandbox Code Playgroud)
您描述的URI是无方案的相对URI.
Thi*_*ilo 77
有什么情况不起作用吗?
如果加载了父页面file://
,那么它可能不起作用(它会尝试获取file://cdn.example.com/js_file.js
,当然你也可以在本地提供).
ken*_*ytm 23
在这里,我复制了HTML的隐藏功能中的答案:
使用与协议无关的绝对路径:
Run Code Online (Sandbox Code Playgroud)<img src="//domain.com/img/logo.png"/>
如果浏览器通过HTTPS查看SSL中的页面,那么它将使用https协议请求该资产,否则它将使用HTTP请求它.
这可以防止IE中的"此页面包含安全和非安全项目"错误消息,将所有资产请求保留在同一协议中.
警告:当在
<link>
aimport或@import上使用样式表时,IE7和IE8会 下载文件两次.然而,所有其他用途都很好.
Ned*_*der 16
放弃协议是完全有效的.URL规范多年来一直非常清楚,我还没有找到一个不理解它的浏览器.我不知道为什么这种技术不为人所知; 它是跨越HTTP/HTTPS边界的棘手问题的完美解决方案.更多信息:Http-https转换和相对URL
有什么情况不起作用吗?
只是把它放在混合中,如果你在本地服务器上进行开发,它可能不起作用.您需要指定一个方案,否则浏览器可能会认为src="//cdn.example.com/js_file.js"
是src="file://cdn.example.com/js_file.js"
,因为您没有在本地托管此资源,所以它将会中断.
Microsoft Internet Explorer似乎对此特别敏感,请看这个问题:无法在localhost(WAMP)上的Internet Explorer中加载jQuery
您可能总是试图找到适用于所有环境的解决方案,并且需要进行最少量的修改.
HTML5Boilerplate使用的解决方案是在资源未正确加载时进行回退,但只有在合并检查时才有效:
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- If jQuery is not defined, something went wrong and we'll load the local file -->
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>
Run Code Online (Sandbox Code Playgroud)
更新:HTML5Boilerplate现在<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
在决定弃用协议相对URL之后使用,请参见[here] [3].
2019 年的答案:您仍然可以使用协议相对 URL,但这种技术 是一种反模式。
还:
从协议相关的 URL 迁移到https://
它会很好。
此答案与 2019 年 1 月相关。将来,此答案的数据可能已过时。
Paul Irish —前端工程师和 Google Chrome 的开发者倡导者—在 2014 年 12 月写道:
既然每个人都鼓励使用SSL并且没有性能问题,这种技术现在是一种反模式。如果您需要的资产在 SSL 上可用,则始终使用该
https://
资产。允许片段通过 HTTP 请求为最近的 GitHub Man-on-the-side攻击等攻击打开了大门。即使您的站点在 HTTP 上,请求 HTTPS 资产始终是安全的,但反之则不然。
例如,我尝试使用clean-console。
KiraCleanConsole__cdn_links_demo.html
:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>clean-console without protocol demonstration</title>
<!-- Really dead link -->
<script src="https://unpkg.com/bowser@latest/bowser.min.js"></script>
<!-- Package exists; link without “https:” -->
<script src="//cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js"></script>
<!-- Package exists: link with “https:” -->
<script src="https://cdn.jsdelivr.net/npm/gemini-scrollbar/index.js"></script>
</head>
<body>
Kira Goddess!
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
D:\SashaDebugging>clean-console -i KiraCleanConsole__cdn_links_demo.html
checking KiraCleanConsole__cdn_links_demo.html
phantomjs: opening page KiraCleanConsole__cdn_links_demo.html
phantomjs: Unable to load resource (#3URL:file://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js)
phantomjs: phantomjs://code/runner.js:30 in onResourceError
Error code: 203. Description: Error opening //cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js: The network path was not found.
phantomjs://code/runner.js:31 in onResourceError
phantomjs: Unable to load resource (#5URL:https://unpkg.com/bowser@2.1.0/bowser.min.js)
phantomjs: phantomjs://code/runner.js:30 in onResourceError
Error code: 203. Description: Error downloading https://unpkg.com/bowser@2.1.0/bowser.min.js - server replied: Not Found
phantomjs://code/runner.js:31 in onResourceError
phantomjs: Checking errors after sleeping for 1000ms
2 error(s) on KiraCleanConsole__cdn_links_demo.html
phantomjs process exited with code 2
Run Code Online (Sandbox Code Playgroud)
链接//cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js
有效,但出现错误。
关注file://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js
并阅读Thilo和bg17aw关于file://
.
我不知道这种行为,也不明白为什么我会遇到这样的问题pageres。
我使用Clickable URLs Sublime Text 包。使用它,我可以简单地从浏览器中的文本编辑器打开链接。
示例中的两个链接均有效。但是我可以在浏览器中成功打开的第一个链接使用可点击的 URL,第二个链接 - 没有。这可能不是很方便。
是的:
Developing process
项目中的问题,您可以设置您的开发工作流程。Third-party tools
item 中遇到问题,你可以贡献工具。但是你不需要这个额外的问题。通过Anti-pattern
项目中的链接阅读信息:协议相关的 URL 已过时。
归档时间: |
|
查看次数: |
114950 次 |
最近记录: |