【问题标题】:Force HTTPS redirection on whole website except for 1 single page在整个网站上强制 HTTPS 重定向,除了 1 个单页
【发布时间】:2018-04-08 15:33:28
【问题描述】:

我的 SSL 由 cloudFlare 管理,但我更喜欢使用 htaccess 方法来控制站点重定向以使用 HTTPS。我有一个域www.mysite.com 和一个子域demo.mysite.com。我希望在 www.mysite.com 的完整网站和 demo.mysite.com 的完整网站上使用 HTTPS,除了我的子域上只有 1 页以防止混合内容。该页面可以包含在 iFrame 中加载的 HTTP 和 HTTPS 链接。目前该页面与整个网站一起以 HTTPS 加载,但我希望它仅以 HTTP 而不是 HTTPS 加载。该页面是demo.mysite.com/surf.php,可以通过点击demo.mysite.com/ads.php 的广告来访问。

我在我的 htaccess 文件中尝试了这个,但页面 surf.php 仍然重定向到 HTTPS。

# FORCE HTTPS
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} \/(surf.php)
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

# DISABLE HTTPS
RewriteCond %{HTTPS} on
RewriteCond %{SCRIPT_FILENAME} !\/(surf.php) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1 [R=301,L]

我在我的 cloudFlare 设置中禁用了“始终使用 HTTPS”,并且我的 SSL 是灵活的。此外,没有设置页面规则。我更喜欢 htaccess 方法。请帮助我并告诉我该怎么做?

【问题讨论】:

  • 有趣。我想知道“HTTPS Everywhere”将如何处理那个。
  • 也许您正在查看缓存的 301 重定向?在再次访问您的网页的 http 版本之前,请尝试清除浏览器缓存。

标签: .htaccess ssl cloudflare cloudflare-workers


【解决方案1】:

我在具有灵活 Cloudflare 证书的 Cloudflare 域上工作。

我有 2 个 Cloudflare 页面规则,而不是使用 .htaccess。

第一条规则:

*.domain.com/page-to-ignore.htm

SSL: Off

第二条规则:

http://*.domain.com/*

Always Use HTTPS  

顺序很重要,在您自己的网站上进行测试时,请确保您已清除浏览器缓存。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    如果您仍然遇到问题,那么您也可以使用 PHP 代码。将此代码粘贴到网站的头文件中,或粘贴到您希望将网站重定向到 HTTPS 或 HTTP 的每个页面上。确保在 cloudFlare 中禁用“始终使用 HTTPS”,您可以选择任何您想要的 SSL,即灵活、完整或完整(严格)。

    用于重定向到 HTTPS 的 PHP 代码:

    if($_SERVER['HTTP_HOST'] != 'localhost'){
      if(!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on'){
        if(!headers_sent()){
          header("Status: 301 Moved Permanently");
          header(sprintf('Location: https://%s%s',$_SERVER['HTTP_HOST'],$_SERVER['REQUEST_URI']));
          exit();
        }
      }
    }
    

    用于重定向到 HTTP 的 PHP 代码:

    if($_SERVER['HTTP_HOST'] != 'localhost'){
      if(isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'on'){
        if(!headers_sent()){
          header("Status: 301 Moved Permanently");
          header(sprintf('Location: http://%s%s',$_SERVER['HTTP_HOST'],$_SERVER['REQUEST_URI']));
          exit();
        }
      }
    }
    

    这对我很有效。将代码粘贴到每一页的顶部。如果您使用的是session_start();,那么在此之后立即放置此代码。这是一个很好的做法。

    【讨论】:

    • 我所有的 HTTP 到 HTTPS 的永久解决方案,反之亦然重定向。非常感谢。这就像一个魅力。我会确保我永远不会丢失此代码:)
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多