除 1 个单页外,在整个网站上强制 HTTPS 重定向

Force HTTPS redirection on whole website except for 1 single page

我的 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} [R=301,L]

我在我的 cloudFlare 设置中禁用了 "Always use HTTPS",我的 SSL 是灵活的。此外,没有设置页面规则。我更喜欢 htaccess 方法。请帮帮我,告诉我该怎么做?

我在具有灵活 Cloudflare 证书的 Cloudflare 域中进行以下工作。

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

第一条规则:

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

SSL: Off

第二条规则:

http://*.domain.com/*

Always Use HTTPS  

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

希望对您有所帮助!

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

PHP 重定向到 HTTPS 的代码:

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();
    }
  }
}

PHP 重定向到 HTTP 的代码:

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();,则将此代码紧跟其后。这是一个很好的做法。