【问题标题】:Short way to link to http from https (and vice versa) using relative links使用相对链接从 https 链接到 http(反之亦然)的快捷方式
【发布时间】:2010-10-09 17:08:08
【问题描述】:

当我在我正在开发的网站的安全部分(使用 https 进入特定页面或文件夹)时,到 普通 页面的相对链接会自动转换为 https也是。

有没有办法告诉 标签始终使用 http 协议而不是 https 协议(或相反)?

我知道使用完整链接(http://www.mysite.com/index.htmlhttps://www.mysite.com/index.html)很容易,但我希望它可以与相对链接(index.html、../index.html 等)一起使用。

【问题讨论】:

    标签: html http https


    【解决方案1】:

    您可以使用以下语法使所有内部链接独立于协议:

    <a href="//some/file/on/your/domain.php">link text</a>

    而不是

    <a href="some/file/on/your/domain.php">link text</a>

    // 将使链接尊重页面加载的任何协议。

    【讨论】:

    • 感谢您的回答。我还没有尝试过,但是正常的相对链接总是遵循加载原始页面的协议,所以这不会改变任何东西。除此之外,我希望特定的 - 相对 - 页面和目录通过 https 和其他通过 http 加载。
    • 对不起,我看错了你的问题。我刚刚回去读了它,它真的不适用。
    • 以两个斜杠开头的 URI 是“网络路径引用”,它的工作原理与 Matt 描述的一样只要您指定域。如示例所示,您不能将此语法用于本地文件(浏览器会尝试将“某些”解析为域)。见URI starting with two slashes … how do they behave?
    • @Rudi,该示例现已更新以涵盖这一点。我对“本地”这个词的使用是模棱两可的。我的意思是它在同一个域上,而不是在本地机器上。
    • @Matthew 请考虑 Rudi 的评论编辑您的答案。
    【解决方案2】:

    我们使用 Apache mod_rewrite 来控制页面是通过 http 还是 https 提供的。以下是站点根目录 .htaccess 文件中的 sn-p 示例:

    # Redirect most reqests for https to http
    RewriteRule ^https://www.example.com(.*) http://www.example.com$1 [R=301,NC]
    
    # Allow some URIs to be https if requested
    RewriteCond   %{SERVER_PORT}  ^443$
    RewriteCond   %{REQUEST_URI}  !^/images/(.*)$
    RewriteCond   %{REQUEST_URI}  !^/scripts/(.*)$
    RewriteCond   %{REQUEST_URI}  !^/styles/(.*)$
    RewriteCond   %{REQUEST_URI}  !^/store(.*)$
    RewriteCond   %{REQUEST_URI}  !^/login.htm$
    RewriteRule ^(.*) http://www.example.com/$1 [L,R]
    
    # Force some URIs to be https only
    RewriteCond   %{SERVER_PORT}  ^80$
    RewriteRule ^store(.*) https://www.example.com/store$1 [L,R]
    
    RewriteCond   %{SERVER_PORT}  ^80$
    RewriteRule ^FormSanityKey.htm https://www.example.com/login$1 [L,R]
    

    阅读全文:

    http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

    【讨论】:

    • +1 表示这句话,让我想起了 Spaceship Earth 中的新闻男孩 :)
    【解决方案3】:

    不确定这是否正是您要寻找的,但如果您使用的是 Apache,则可以使用一个技巧来做到这一点:http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html#relative

    基本上,您将以下内容放入您的 Apache 配置文件中:

    RewriteEngine on
    RewriteRule ^/(.*):SSL$ https://%{SERVER_NAME}/$1 [R,L]
    RewriteRule ^/(.*):NOSSL$ http://%{SERVER_NAME}/$1 [R,L]
    

    然后将:SSL 附加到您想要对其强制使用HTTPS 的任何链接(在网页中),并将:NOSSL 附加到您想要对其强制使用常规HTTP 的任何链接。

    【讨论】:

      【解决方案4】:

      听起来你想使用the BASE element

      没有办法“告诉”锚点使用或不使用特定协议,至少不使用该页面 HEAD 中的 BASE 元素。

      您为什么要使用相对链接而不是绝对链接? This article 谈到了在 HTTPS 中使用相对链接的陷阱 - 可能让您的网站被双重索引等等。

      【讨论】:

      • 谢谢。基本元素会影响页面上的所有链接,并且在同一页面上会有两种链接(http 和 https)。我也更喜欢相对链接,因为它使慢速互联网连接上的生活(测试等)变得更加容易,而且我可以在服务器上的文件夹中测试网站。
      • 对您的网站进行双重索引?不是分度机的问题吗?比如——他们不检查文件是否有相同的内容吗?我不支持根据搜索引擎在特定时间点工作的错误程度(无论如何这可能与他们未来的行为不同)为网站管理员创造“规则”。
      【解决方案5】:

      由于您使用的是不同的协议,因此无法使用相对超链接来执行此操作,这与链接到 ftp 位置没有什么不同。

      【讨论】:

      • 这只是 URL/URI 语法的一个缺点。我可以很容易地想象一个世界,你可以有一个相对路径的链接,但绝对协议(如“保留其余部分,更改路径和协议”),就像我们有协议相对链接(“保留协议,更改所有紧接着”)。我们只是碰巧没有生活在这个世界上。
      【解决方案6】:

      我使用此代码创建当前索引页面的链接以指向https服务器,因为我们根据协议提供不同的内容,我们不知道托管在哪里。

        <a>Secure server
          <script>
            let url = new URL(window.location);
            url.protocol = 'https:';
            url.port = '443';
            document.currentScript.parentElement.href = url.toString();
          </script>
        </a>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-03
        • 2017-08-01
        • 1970-01-01
        • 2014-07-17
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多