【问题标题】:Wordpress get_template_directory_uri() behind load balancer负载均衡器后面的 Wordpress get_template_directory_uri()
【发布时间】:2017-05-25 12:40:12
【问题描述】:

我有一个在 AWS EC2 实例上运行的 Wordpress 网站。这是通过 AWS Elastic Load Balancer 提供的,它启用了 HTTPS,并带有我从 Amazon 获得的证书。

目的是同时提供网站的 http 和 https 版本。加载 http 版本工作正常。

但是,当我加载 https 版本时,我会遇到混合内容错误,因为 get_template_directory_uri() 总是返回 http 链接。负载均衡器的工作方式是 TLS 在 LB 处终止,它通过端口 80 与实际的 EC2 实例通信。因此,实例本身没有 HTTPS。

这有很多是我无法治愈的。我知道的只是足以弄清楚问题似乎是什么,但我真的不确定解决它的正确方法是什么。

假设我仍然想同时提供页面的 http 和 https 版本(页面上没有电子商务或身份验证 - 这只是提供信息),我应该如何解决这个问题?

仅供参考,EC2 实例在 Amazon ABI 上运行,基本上是 RHEL。

【问题讨论】:

    标签: wordpress amazon-web-services ssl https


    【解决方案1】:

    首先,您会发现很难从相同的数据库数据中同时运行 http 和 https WordPress 版本,因为 WordPress 将大量链接保存为绝对链接(即使用 http(s)://mydomain.com部分),而且很多插件也懒得适应当前的协议。

    您最好的选择是通过您的 htaccess 文件进行重定向,以将所有 http 流量重定向到 https。

    话虽如此,你可以做你所要求的一种方法是通过 get_template_directory_uri 使用的过滤器:

    add_filter('template_directory_uri', 'smart_template_directory_uri', 10, 3);
    function smart_template_directory_uri($template_dir_uri, $template, $theme_root_uri) {
        return preg_replace('/^https?\:/i', '//', $template_dir_uri); // replace "http://" or "https://" by "//", which browsers will automatically set to the current page's protocol
    }
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢。看起来您发布的代码将所有链接都转换为https 链接。那正确吗?所以页面本身将通过http 提供服务,但其中嵌入的所有内容都将通过https 提供服务?
    • 哦,好的,我现在明白了。假设所有(假设是现代的)浏览器都会将 // 转换为 http[s]:// 是否安全?
    • 是的 - 在这里查看这个答案:stackoverflow.com/questions/4831741/…
    • 很好的链接,谢谢。我想我真正需要问自己的问题是我想要支持 http 吗?然后我将如何只提供 https 服务。我没有自己的(非常昂贵的)证书可以放在 EC2 实例上。这使我走上了一条我不知道的道路。
    • 是的,我的选择是强制一切都是 https。很多网站都在走这条路。至于证书,我认为您可以在 AWS 上使用一些收费的 (letsencrypt.org):google.ca/search?q=lets+encrypt+aws&oq=lets+encrypt+aws
    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2018-03-24
    • 2015-06-17
    • 2011-01-10
    相关资源
    最近更新 更多